阅读 11

30、Spring的事务实现原理是什么?能聊聊你对事务传播机制的理解吗?

spring ioc和aop,动态代理技术,bean的线程安全问题,事务机制

事务的实现原理,事务传播机制,如果说你加了一个@Transactional注解,此时就spring会使用AOP思想,对你的这个方法在执行之前,先去开启事务,执行完毕之后,根据你方法是否报错,来决定回滚还是提交事务

// 开启一个事务

// 执行方法A的代码,接着执行方法B的代码

// 提交或者回滚事务

// 开启一个事务1

// 执行方法A里的一些代码,doSomethingPre()

// 开启一个事务2

// 执行方法B里的一些代码

// 提交或者回滚事务2

// 执行方法A里的一些代码,doSomethingPost()

// 提交或者回滚事务1

// 开启一个事务

// 执行方法A里的一些代码,doSomethingPre()

// 设置一个回滚点,savepoint

// 执行方法B里的一些代码

// 如果方法B里抛出了异常,此时进行回滚,回滚到之前的savepoint

// 执行方法A里的一些代码,doSomethingPost()

// 提交或者回滚事务

嵌套事务,外层的事务如果回滚,会导致内层的事务也回滚;但是内层的事务如果回滚,仅仅是回滚自己的代码

① PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。

② PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘

③ PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。

④ PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。

⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。

出去面试,事务传播机制

比如说,我们现在有一段业务逻辑,方法A调用方法B,我希望的是如果说方法A出错了,此时仅仅回滚方法A,不能回滚方法B,必须得用REQUIRES_NEW,传播机制,让他们俩的事务是不同的

方法A调用方法B,如果出错,方法B只能回滚他自己,方法A可以带着方法B一起回滚,NESTED嵌套事务