事务的实现原理
加一个@Transactional注解,此时spring会使用AOP思想,对你的这个方法在执行之前,先去开启事务,执行完毕之后,根据你方法是否报错,来决定回滚还是提交事务
事务传播机制
一个加了@Transactional注解的方法,调用另外一个加了@Transactional注解的方法,这个事务是如何传播的?
(1)Propagation.REQUIRED(默认值,不加的时候也默认为Required)常用
如果调用我这个方法的时候,没有事务,则创建一个新的事务。如果已经有事务了,那么把他加到现有的事务中
(2)Propagation.SUPPORTS少见
方法B改成SUPPORTS:如果单独去调用时,不会开启事务。必须是开启事务的方法A去调用这个方法
支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行
(3)Propagation.MANDATORY少见
方法B改成MANDATORY:必须是开启事务的方法去调用方法B,不然报错
支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常
(4)Propagation.REQUIRES_NEW也会有
方法B改成REQUIRED_NEW:强制开启新的事务,AB两个事务互不影响
创建新事务,无论当前存不存在事务,都创建新事务
(5)Propagation.NOT_SUPPORTED少见
强制要求以非事务的方式执行,如果当前存在事务,则把当前事务挂起
(6)Propagation.NEVER少见
以非事务方式执行,如果当前存在事务,则抛出异常
(7)Propagation.NESTED事务的嵌套,会用,但不经常用
如果方法A抛出异常,会回滚全部代码。如果方法B中抛出异常,则会回滚到之前的savepoint
嵌套事务:外层的事务如果回滚,会导致内层的事务也回滚;但是内存的事务如果回滚,仅仅是回滚自己的代码
面试题
1.我们现在有一段业务逻辑,方法A调用方法B,我希望的是如果说方法A出错了,此时仅仅回滚方法A,不能回滚方法B?
必须用REQUIRES_NEW,传播机制,让他们俩的事务是不同的
2.方法A调用方法B,如果出错,方法B只能回滚他自己,方法A可以带着方法B一起回滚?
NESTED嵌套事务
这种时候要告诉面试官,要用哪种传播机制来做(见上面7中传播机制)
【评论区】
1、他人总结
(1)事务的传播,是用于Servcie层相互调用时,解决事务作用范围的一个机制
(2)主要分为三大类:A与B要处于同一个事务,A与B不能处于同一事务,最后就是适用于嵌套事务模型的nexted
(3)具体的场景使用场景需要根据业务场景选择