Spring事务 @Transactional
- 1.访问权限问题
- 2.方法用final修饰
- 3.方法内部调用
- 4.未被spring管理
- 5.多线程调用
- 6.表不支持事务
- 7.错误的传播特性
- 8.自己吞了异常
- 9.手动抛了别的异常
- 10.自定义了回滚异常
- 11.嵌套事务回滚多了
1.访问权限问题
java的访问权限主要有四种:private,default,protected,public,如果某些事务方法,定义了错误的访问权限,就会导致事务功能出现问题:
1 |
|
add方法的访问权限被定义成了 private,这样会导致事务失效,spring是要求代理方法必须是 public 的,在 AbstractFallbackTransactionAttributeSource类的computeTransactionAttribute方法中有一个判断,如果目标方法不是public的,则TransactionAttribute返回null,即不支持书事务。
1 | protected TransactionAttribute computeTransactionAttribute(Method method, Class<?> targetClass){ |
如果自定义的事务方法(目标方法),他的访问权限不是public,而是private,default或protected的话,spring则不会提供事务功能。
2.方法用final修饰
有时候,某个方法不想被子类重写,我们会将此方法定义为final的。如果是事务方法定义成final的,
1 |
|
这样会导致事务失效。spring事务的源码,使用了aop,也就是通过jdk动态代理或者cglib,帮我们生成了代理类,在代理类中实现的事务功能。如果某个方法用final修饰了,那么在它的代理类中,也就无法重写该方法,进而不能添加事务功能。如果某个方法是static的,同样无法通过动态代理,变成事务方法。