Spring高手之路-Spring事务的传播机制(行为、特性)

目录

含义

七种事务传播机制

1.REQUIRED(默认)

2.REQUIRES_NEW

3.SUPPORTS

4.NOT_SUPPORTED

5.MANDATORY

6.NEVER

7.NESTED


含义

Spring事务的传播机制是指在多个事务方法相互调用时,如何处理这些事务的传播行为。对应七种事务传播行为(处理决策)。

七种事务传播机制

如图:

1.REQUIRED(默认)

如果当前存在事务(主要是通过检查ThreadLocal中的事务信息来完成的),则加入该事务;如果没有事务,则创建一个新的事务;总是一个事务在执行。这是最常见的传播行为,也是默认的传播行为。

通俗理解就是,外部没事务,我就开一个事务,外部有事务,我就融合进去,既然融合进去了我一旦异常,外部事务所有操作,全部回滚。

java 复制代码
    @Transactional//默认
    public void addUser(){

        insertUser();//插入数据
        init();//初始化用户的各项的信息
        log();//日志记录
    }
    
    
    @Transactional//默认
    public void insertUser(){
        //数据库用户表插入一条新数据
        //。。。。。。。。。。
    }

    @Transactional
    public void init(){
        //初始化用户信息,如用户的个人空间信息、用户的消息列表、工作空间等
        //。。。。。。。。。。
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void  log(){
        //日志记录
        //。。。。。。。。。。
    }

这段代码有个添加新用户的方法(开启了事务),方法内会插入一条用户数据、初始化用户各项业务信息、记录日志,调用的三个方法都开启了事务, insertUser()和 init()都是默认事务传播,只要两者有一方异常,整个addUser()全部都会回滚。

这意味着,如果这个方法内部抛出了异常,那么整个事务(包括这个方法和之前的其他数据库操作)都会回滚,确保数据的一致性。

适用于增删改查

2.REQUIRES_NEW

无论当前是否存在事务,都会创建一个新的事务。如果当前存在事务,则将其挂起,等待新的事务完成后再恢复。

说人话就是,我不管你外部有没有事务,我自己单独开一个事务,我异常了,我自己回滚,不会影响到外部的事务。

java 复制代码
    @Transactional//默认
    public void addUser(){

        insertUser();//插入数据
        init();//初始化用户的各项的信息
        log();//日志记录
    }
    
    
    @Transactional//默认
    public void insertUser(){
        //数据库用户表插入一条新数据
        //。。。。。。。。。。
    }

    @Transactional
    public void init(){
        //初始化用户信息,如用户的个人空间信息、用户的消息列表、工作空间等
        //。。。。。。。。。。
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void  log(){
        //日志记录
        //。。。。。。。。。。
    }

同样是这段代码,有个log()记录日志方法事务传播机制设置为REQUIRES_NEW,这意味着在addUser()中 insertUser()、init()是融合到了addUser()的外层事务中,但是log(),自己单独开启了一个事务,log()内部异常了,就会回滚log()方法自己,对于addUser()没有影响。

REQUIRED不同,REQUIRES_NEW会确保每次调用updateUser方法时都创建一个新的事务。在这个新的事务里面出现了异常,则会回滚,但并不会影响到其他事务,这种传播行为常用于需要隔离性较高的场景,例如支付、转账等操作。

适用于内部事务和外部事务不存在业务关联情况,如日志。

3.SUPPORTS

如果当前存在事务,则加入该事务;如果没有事务,则以非事务方式执行。适用于不需要强制要求事务的场景。

说人话就是,外部没事务,我也不会主动开事务,直接执行,外部有事务,我就融合进去。

适用于查询

4.NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,则将其挂起,直到操作完成后再恢复事务。

说人话就是,外部有没有事务我不管,我就要无事务执行。

这个不常用

5.MANDATORY

要求当前存在事务,如果没有事务,则抛出异常。

说人话就是,外部没事务,我不乐意,直接抛异常,外部有事务,我融合进去,总之外部你就得给我提供一个事务。

这个不常用

6.NEVER

要求不存在事务,如果当前存在事务,则抛出异常。

说人话就是,外部没有事务,我直接无事务执行,外部有事务,我就捣乱,直接抛异常。总之就是不能有事务。

这个不常用

7.NESTED

如果外部不存在事务,则开启新事务;如果当前存在事务,则在嵌套事务内执行。嵌套事务是独立于外部事务的子事务,它具有自己的保存点(savepoint),可以回滚到该保存点。

说人话就是,外部存在事务,我就融合进去,但是我出问题抛异常了,我自己的问题,自己回滚,不影响外层,但是外层抛异常了,我就得回滚,外层影响内层,内层不影响外层。那外部没事务,我就新开一个事务,同样遵循外层影响内层,内层不影响外层。

这个不常用

相关推荐
论迹复利3 小时前
FreeRTOS 在 RISC-V 上是如何“点火“的 —— 从 main() 到第一个任务的完整链路
java·开发语言·risc-v
小江的记录本3 小时前
【CSS】CSS 动画:transition、animation、transform、CSS3 新特性(附《思维导图》)
前端·css·安全·spring·前端框架·css3·动画
张宇Joaquin3 小时前
鲲鹏统一并行加速库KUPL--众核并行能力介绍
java·开发语言·网络
宸津-代码粉碎机4 小时前
AI攻防战升级!基于Spring AI构建Java应用自动免疫安全体系
java·大数据·开发语言·人工智能·python·安全·spring
2601_963749105 小时前
越华环保集团数字化污水治理:端边云采集架构与平台对接实现
java·大数据·架构
xcLeigh5 小时前
Go入门:整数类型的溢出与安全边界
java·安全·golang
源码宝6 小时前
SpringBoot+Vue2 诊所门诊管理系统,完整前后端源码,可直接部署上线
java·源码·his系统·门诊系统·程序代码·诊所系统·门诊his
yychen_java6 小时前
九:Text-to-SQL 智能数据查询与 Human-in-the-Loop 人机协作
java·人工智能·架构
user_admin_god6 小时前
数据采集/交换系统设计经验
spring boot·spring·策略模式
lhldsg7 小时前
智慧场馆解决方案小程序开发实战:从架构设计到部署指南
java·小程序·uni-app