事务检查

事务检查

doMore 878 2019-10-09

事务不生效场景:

  1. 看一下数据库的引擎是否支持事务(MySQL的Mylsam引擎不支持事务)

  2. 注解所在的类是否被加载成一个 Bean
    2.1 不要在接口上声明@Transactional ,而要在具体类的方法上使用 @Transactional 注解,否则注解可能无效。
    2.2 不要在抽象方法的具体实现上声明@Transactional,比如一个父类,存在一个抽象方法A,在子类中实现此抽象方法A并声明@Transactional,父类中调用此抽象方法A,事务不生效。

  3. 使用了@Transactional的方法,对同一个类里面的方法调用, @Transactional无效。比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。(经常在这里出错)

  4. 所用的数据源是否加载了事务管理器

  5. @Transational 的扩展配置 propagation(事务的传播机制) 是否正确

  6. 使用了@Transactional的方法,只能是public,@Transactional注解的方法都是被外部其他(Service或Controller)调用才有效,故只能是public。故在 protected、private或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错,但事务无效。

  7. 涉及事务执行的方法不要使用try...catch包裹,例如:

try{
  jdbc.insert(obj);
}catch(Exception ex){
  // capture an exception but do nothing
}
// 异常只能被抛出,事务才会生效

事务优化:

1.不要将@Transactional放置在类级的声明中,放在类声明,会使得所有方法都有事务。@Transactional应该放在方法级别,不需要使用事务的方法,就不要放置事务,比如查询方法。否则对性能是有影响的。

问题汇总:

序列号问题
1private方法上添加了有事务注解
2该使用事务的方法漏添加了事务注解