public class Spread {
@Transactional(rollbackFor=Exception.class)
public void entry(){
doSomething();
}
@Transactional(rollbackFor=Exception.class)
public void doSomething(){
}
}
1 方法doSomething本身带事物,调用该doSomething的方法entry也是带着事物
这时候2个事物碰到一起了该怎么工作
2 这里所说的事物的传播都是指当前线程内,不跨线程,不涉及子线程的
事物传播的方式
发现事物的依据是当前线程内没有第二个事物
第一种:REQUIRED
如果当前存在事物,则加入该事物;如果当前没有事物,则创建一个新事物。这是默认值 就是说entry方法是先执行的,当entry方法已经开启了一个事物,调用doSomething方法时,doSomething方法的事物判断当前线程是否开启事物,如果开启了,就不再创建新事物直接加入到entry事物中,若doSomething的方法事物发现当前线程内没有事物,那么它自己就开启一个事物
第二种:REQUIRED_NEW
创建一个新事物,如果当前存在事物,则把当前的挂起entry开启自己的事物,调用到doSomething时挂起entry的事物,开启doSomething的事物
第三种:SUPPORTS
如果当前存在事物,则加入该事物,如果当前没有事物,则以非事物的方式运行
第四种:NOT_SUPPORTS
以非事物的方式运行,如果当前存在事物,则把当前事物挂起;其实就是不让按照事物方式运行,使用场景:完全不以事物方式运行的程序,暴力,慎用
第五种:NEVER
以非事物方式运行,如果当前存在事物抛出异常 也是不以事物方式运行
第六种:MANDATORY
如果当前存在事物则加入该事物,如果不存在则抛出异常,意思就是程序都要按照事物运行,安全级别比较高
第七种:NESTED
当前存在事物,则创建一个事物作为当前事物的嵌套事物运行,如果当前不存在事物则取值等价于第一个