-
方法是不是 public 修饰的
-
是否是同一个类中的方法调用(如A方调用同一个类中的B方法,在B方法上加的事务)
(注意:
方法A上: @Transactional(rollbackFor = Exception.class)
方法B上: @Transactional(rollbackFor = Exception.class)
1、如果在B方法加上TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();,结果是事务正常回滚,控制台打印出少量异常,前端无异常信息,格式例子在第4条上)
2.、如果去掉 上面 1 ,则控制台打印出少量异常,前端返回异常信息 -
异常类型是否为unchecked异常?如果想check异常也想回滚怎么办,注解上面写明异常类型即可。
@Transactional(rollbackFor=Exception.class)
类似的还有 norollbackFor,自定义不回滚的异常
- 异常是不是被catch住了,如果既要打出异常日志,又要回滚,如下:
@Transactional(rollbackFor = Exception.class)
public void test() {
try {
updata();
updata2();
} catch (Exception e) {
e.printStackTrace();
//如果updata2()抛了异常,updata()会回滚,不影响事物正常执行
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
- 查看自己的数据的引擎,如果是 MySQL,注意表要使用支持事务的引擎,比如innodb,如果是myisam,事务不起作用
查看 MySQL 的所有存储引擎:show engines;
查看 MySQL 的当前存储引擎:show variables like ‘%storage_engine%’;
6、如果是 ssm 框架,在用 xml 配置开启的事务,那你要看一下:
- 是否开启了对注解的解析
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
- spring是否扫描到你这个包,如下是扫描到org.test下面的包
<context:component-scan base-package="org.test" ></context:component-scan>