Spring事务的传播
1。PROPAGATIONREQUIRED
最常用的事务机制,如果外层有事务,外层和内层都会处于两个事务中,要么一起成功,要么一起都失败回滚。
2。PROPAGATIONSUPPORTS
如果其他bean调用这个方法时,其他bean声明了事务,则就用这个事务,如果没有声明事务,那就不用事务3。PROPAGATIONMANDATORY
必须在一个事务中执行。也就是说,他仅仅能被一个父事务调用。否则,他就要抛出异常4。PROPAGATIONREQUIRESNEW
这个就比较绕口了。比方我们设计ServiceA。methodA的事务级别为PROPAGATIONREQUIRED,ServiceB。methodB的事务级别为PROPAGATIONREQUIRESNEW。那么当运行到ServiceB。methodB的时候,ServiceA。methodA所在的事务就会挂起。ServiceB。methodB会起一个新的事务。等待ServiceB。methodB的事务完毕以后,他才继续运行。他与PROPAGATIONREQUIRED的事务差别在于事务的回滚程度了。由于ServiceB。methodB是新起一个事务,那么就是存在两个不同的事务。假设ServiceB。methodB已经提交,那么ServiceA。methodA失败回滚。ServiceB。methodB是不会回滚的。假设ServiceB。methodB失败回滚,假设他抛出的异常被ServiceA。methodA捕获,ServiceA。methodA事务仍然可能提交。
5。PROPAGATIONNOTSUPPORTED
当前不支持事务。比方ServiceA。methodA的事务级别是PROPAGATIONREQUIRED。而ServiceB。methodB的事务级别是PROPAGATIONNOTSUPPORTED,那么当执行到ServiceB。methodB时。ServiceA。methodA的事务挂起。而他以非事务的状态执行完,再继续ServiceA。methodA的事务。6。PROPAGATIONNEVER
不能在事务中执行。如果ServiceA。methodA的事务级别是PROPAGATIONREQUIRED。而ServiceB。methodB的事务级别是PROPAGATIONNEVER,那么ServiceB。methodB就要抛出异常了。7。PROPAGATIONNESTED
如果当前存在事务,则在嵌套事务内执行。内外层同属一个事务一同提交
如果当前没有事务,则执行与REQUIRED类似的操作,即直接新建一个事务单独提交;