1、检查你方法是不是public的
2、你的异常类型是不是unchecked异常
如果我想check异常也想回滚怎么办,注解上面写明异常类型即可,项目一般都会自定义一个异常,所有catch住的异常都会抛出这个异常
@Transactional(rollbackFor=Exception.class)
类似的还有norollbackFor,自定义不回滚的异常
3、数据库引擎要支持事务,如果是MySQL,注意表要使用支持事务的引擎,比如innodb,如果是myisam,事务是不起作用的,一般看表是不是innodb引擎就好了
4、是否开启了对注解的解析
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
5、检查是不是同一个类中的方法调用(如a方法调用同一个类中的b方法),同一个包A类的a方法调用B类的b方法也不行,要使用代理
使用代理
@Autowired
private DemoService demoService;
或者
//代理拿到bean
DemoService d = (DemoService)AopContext.currentProxy();
d.queryEcodeByEname(name);
//两者一样
// demoService.queryEcodeByEname(name);
6、异常是不是被你catch住了,有异常一定要抛出
7.这样两个更新都被回滚
@Transactional(rollbackFor = Exception.class)
@Override
public String queryEcodeByEname(String name) throws Exception {
userMapper.updateNameById(1, "11");
this.t();
if ("刘文艺".equals(name))
throw new Exception("失败");
return "";
}
public void t() throws Exception {
userMapper.updateNameById(2, "11");
}
两个都会回滚
@Transactional(rollbackFor = Exception.class)
@Override
public String queryEcodeByEname(String name) throws Exception {
userMapper.updateNameById(1, "11");
this.t(name);
return "";
}
public void t(String name) throws Exception {
userMapper.updateNameById(2, "11");
if ("刘文艺".equals(name))
throw new Exception("失败");
}