Spring事务那些事
1.Spring事务是通过AOP切面技术来实现控制的。
2.事务传播属性默认REQUIRED,同一个线程使用的是同一个连接对象(存储在ThreadLocal中),
多个事务调用中,如果子事务是REQUIRES_NEW,则会将父事务挂起,执行子事务,完成之后再恢复父事务。REQUIRES_NEW 特性为子事务自行处理回滚提交任务。
3.多个事务调用链路中,如果在最顶层事务中捕获异常,是没法阻止事务回滚的。除非在子事务异常的地方将异常捕获并不上抛,否则全局事务都会回滚,这是因为在Spring源码中,子事务异常回滚的时候会设置全局回滚属性为true(setRobackOnly)
如果 RollbackOnly 属性为true,则在最上层事务提交的时候会先回滚,再提交。
4.同一个类里面,直接调用当前类的方法,是不会组成事务传播特性的。例如:A方法无事务,B方法有事务,C方法有事务,A直接调用B,B方法中调用C,C异常,是不会触发B事务和C事务回滚的。
这是因为Spring事务是通过AOP实现,A本身无事务,直接调用B,是无法触发事务开启的。如果通过bean调用B方法,是能触发B、C事务的。当然,,此操作仅能回滚B、C事务,是无法回滚A自身业务的