事务的传播属性:
1: REQUIRED
如果当前已经有事务了,就使用当前事务,如果没有,就新起一个事务。
解释:A方法的事务启动----B1方法事务-------B2方法事务-------A方法事务结束
此时因为A方法已经新起了一个事务,因此在B1方法时就不会另起新的事务,这时只要A方法中出现异常,包括由A方法本身引起的,两个B方法引起的等,都会引起整个A事务回滚,即两个B方法的事务也要回滚。
2.: REQUIRE_NEW
不管外部事务存不存在,都会在内部事务中新起一个事务,挂起其他事务。
解释:A方法的事务启动T1,B1方法新起事务T2,B2方法新起事务T3,如果在A事务执行过程中,B1的事务已经正常完成,B2事务出现异常;首先B2肯定回滚,由于异常向上抛出,那么引起A出现异常,那么A也回滚。此时B1的事务已经完成,不会进行回滚;。如果在A中对B2的异常进行try/catch那么A方法不会出现异常,不需要回滚。
3: SUPPORTS
如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形式运行
4: MANDATORY
必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常
5: NOT_SUPPORTED
当前不支持事务。
6: NEVER
不能在事务中运行。
7: NESTED
理解Nested的关键是savepoint。他与REQUIRES_NEW的区别是,REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,
而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。