@Transactional事务几点注意

这里面有几点须要你们留意:
A. 一个功能是否要事务,必须归入设计、编码考虑。不能仅仅完成了基本功能就ok。
B. 若是加了事务,必须作好开发环境测试(测试环境也尽可能触发异常、测试回滚),确保事务生效。
C. 如下列了事务使用过程的注意事项,请你们留意。spring

  1. 不要在接口上声明@Transactional ,而要在具体类的方法上使用 @Transactional 注解,不然注解可能无效。
  2. 不要图省事,将@Transactional放置在类级的声明中,放在类声明,会使得全部方法都有事务。故@Transactional应该放在方法级别,不须要使用事务的方法,就不要放置事务,好比查询方法。不然对性能是有影响的。
  3. 使用了@Transactional的方法,对同一个类里面的方法调用, @Transactional无效。好比有一个类Test,它的一个方法A,A再调用Test本类的方法B(无论B是否public仍是private),但A没有声明注解事务,而B有。则外部调用A以后,B的事务是不会起做用的。(常常在这里出错)
    因为内部方法使用this.的方式调用,没有经过spring管理的bean进行调用,因此没法经过代理织入的方式实现AOP,解决这个问题能够经过ApplicationContext获取bean的方式进行调用。
  4. 使用了@Transactional的方法,只能是public,@Transactional注解的方法都是被外部其余类调用才有效,故只能是public。道理和上面的有关联。故在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错,但事务无效。
  5. 通过在ICORE-CLAIM中测试,效果以下: * 抛出受查异常XXXException,事务会回滚。 * 抛出运行时异常NullPointerException,事务会回滚。 * Quartz中,execute直接调用加了@Transactional方法,能够回滚;间接调用,不会回滚。(即上文3点提到的) * 异步任务中,execute直接调用加了@Transactional方法,能够回滚;间接调用,不会回滚。(即上文3点提到的) * 在action中加上@Transactional,不会回滚。切记不要在action中加上事务。 * 在service中加上@Transactional,若是是action直接调该方法,会回滚,若是是间接调,不会回滚。(即上文3提到的) * 在service中的private加上@Transactional,事务不会回滚。
相关文章
相关标签/搜索