Spring事务
事务
spring的事务是由aop来实现的,首先要生成具体的代理对象,然后按照aop的整套流程来执行具体的操作逻辑,正常情况下要通过通知来完成核心功能,但是事务不是通过通知来实现的,而是通过一个TransactionInterceptor
,然后调用invoke来实现具体的逻辑
1. 先做准备工作,解析各个方法上事务相关的属性,根据具体的属性来判断是否开始新事务
2. 当需要开启的时候,获取数据库连接,关闭自动提交功能,开起事务
3. 执行具体的sql逻辑操作
4. 在操作过程中,如果执行失败了,那么会通过completeTransactionAfterThrowing来完成事务的回滚操作,回滚的具体逻辑是通过doRollBack方法来实现的,实现的时候也是要先获取连接对象,通过连接对象来回滚
5. 如果执行过程中,没有任何意外情况的发生,那么通过commitTransactionAfterReturning来完成事务的提交操作,提交的具体逻辑是通过doCommit方法来实现的,实现的时候也是要获取连接,通过连接对象来提交
6. 当事务执行完毕之后需要清除相关的事务信息cleanupTransactionInfo
失效场景
1、非public权限修饰方法
2、内部捕获了异常
3、没有抛出异常
4、非RuntimeException抛出
事务传播
Spring提供了7种传播特性:Required、Requires_new、nested、Support、Not_Support、Never、Mandatory
Required:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
Requires_new:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
- nested:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则创建一个新的事务。
Mandatory:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
- Support:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
Not_Support:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
- Never:以非事务方式运行,如果当前存在事务,则抛出异常。
某一个事务嵌套另一个事务的时候怎么办?
总:事务的传播特性指的是不同方法的嵌套调用过程中,事务应该如何进行处理,是用同一个事务还是不同的事务,当出现异常的时候会回滚还是提交,两个方法之间的相关影响,在日常工作中,使用比较多的是Required、Requires_new、nested
- 判断内外方法是否是同一个事务:
- 是:异常统一在外层方法处理
- 不是:内层方法有可能影响到外层方法,但是外层方法是不会影响内层方法的
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 goMars的学习随记!
评论