场景:在方法A中包含方法B的调用。
比如:方法A
# fly账号给zhangshang转账100块钱
public void user(fly,zhangshan,100){
add(zhangshang,100); //张三加100
sub(fly,100) //fly减100
}
方法B就是add跟sub
注意事务传播行为的注解一般放在方法B上
事务传播行为的注解:
propagation_requierd(必须的)
1、如果事务注解加在方法A上,事务传播注解放在方法B上:
执行方法A,方法A会开启事务,当执行到方法B的时候,方法B会加入到方法A中的事务
2、如果事务注解不加在方法A上,事务传播注解放在方法B上:
方法A因为不存在事务,方法B会开启一个新的事务运行。
总结:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中
propagation_supports(支持)
1、如果事务注解加在方法A上,事务传播注解加在方法B上:
外层方法A开启事务,然后方法B也会加入到方法A中的事务
2、如果事务注解不加在方法A上,事务传播注解加在方法B上,那么:
方法A没有事务,且方法B也没有事务
总结:如果方法A有事务则方法B加入该事务,如果方法A没有事务,那么方法B也没有事务
propagation_mandatory(强制)
1、如果事务注解加在方法A上,事务传播注解加在方法B上:
外层方法A开启事务,然后方法B也会加入到方法A中的事务
2、如果事务注解不加在方法A上,事务传播注解加在方法B上,那么:
方法A没有事务,方法B会抛出异常
propagation_required_new(隔离)
1、如果事务注解加在方法A上,事务传播注解加在方法B上:
方法A有事务,但是方法B会把方法A的事务给挂起暂停了然后自己新建一个事务去运行
2、如果事务注解不加在方法A上,事务传播注解加在方法B上,那么:
方法A没有事务,方法B也新建一个事务去运行
propagation_not_supported(不支持)
1、如果事务注解加在方法A上,事务传播注解加在方法B上:
方法A有事务,方法B会把方法A的事务给挂起暂停了,然后以没有事务的方式运行
2、如果事务注解不加在方法A上,事务传播注解加在方法B上,那么:
方法A没有事务,方法B也没有事务
propagation_never(强制非事务)
1、如果事务注解加在方法A上,事务传播注解加在方法B上:
方法A有事务,方法B抛出异常
2、如果事务注解不加在方法A上,事务传播注解加在方法B上,那么:
方法A没有事务,方法B没有事务