事务

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

  • 判断内外方法是否是同一个事务:
    • 是:异常统一在外层方法处理
    • 不是:内层方法有可能影响到外层方法,但是外层方法是不会影响内层方法的