Spring事务的传播机制(行为、特性)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Spring事务的传播机制(行为、特性)

含义

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

七种事务传播机制

如图:

1.REQUIRED(默认)

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

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

    @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

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

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

    @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),可以回滚到该保存点。

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

这个不常用

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
20天前
|
SQL Java 关系型数据库
Spring事务传播机制:7种姿势教你玩转"事务接力赛"
事务传播机制是Spring框架中用于管理事务行为的重要概念,它决定了在方法调用时事务如何传递与执行。通过7种传播行为,开发者可以灵活控制事务边界,适应不同业务场景。例如:REQUIRED默认加入或新建事务,REQUIRES_NEW独立开启新事务,NESTED支持嵌套回滚等。合理使用传播机制不仅能保障数据一致性,还能提升系统性能与健壮性。掌握这“七种人格”,才能在复杂业务中游刃有余。
|
2月前
|
Java 关系型数据库 数据库
深度剖析【Spring】事务:万字详解,彻底掌握传播机制与事务原理
在Java开发中,Spring框架通过事务管理机制,帮我们轻松实现了这种“承诺”。它不仅封装了底层复杂的事务控制逻辑(比如手动开启、提交、回滚事务),还提供了灵活的配置方式,让开发者能专注于业务逻辑,而不用纠结于事务细节。
|
7月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——常见问题总结
本文总结了Spring Boot中使用事务的常见问题,虽然通过`@Transactional`注解可以轻松实现事务管理,但在实际项目中仍有许多潜在坑点。文章详细分析了三个典型问题:1) 异常未被捕获导致事务未回滚,需明确指定`rollbackFor`属性;2) 异常被try-catch“吃掉”,应避免在事务方法中直接处理异常;3) 事务范围与锁范围不一致引发并发问题,建议调整锁策略以覆盖事务范围。这些问题看似简单,但一旦发生,排查难度较大,因此开发时需格外留意。最后,文章提供了课程源代码下载地址,供读者实践参考。
140 0
|
7月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
933 0
|
3月前
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
109 2
|
5月前
|
人工智能 Java 数据库连接
Spring事务失效场景
本文深入探讨了Spring框架中事务管理可能失效的几种常见场景及解决方案,包括事务方法访问级别不当、方法内部自调用、错误的异常处理、事务管理器或数据源配置错误、数据库不支持事务以及不合理的事务传播行为或隔离级别。通过合理配置和正确使用`@Transactional`注解,开发者可以有效避免这些问题,确保应用的数据一致性和完整性。
240 10
|
4月前
|
Java 关系型数据库 MySQL
【Spring】【事务】初学者直呼学会了的Spring事务入门
本文深入解析了Spring事务的核心概念与使用方法。Spring事务是一种数据库事务管理机制,通过确保操作的原子性、一致性、隔离性和持久性(ACID),维护数据完整性。文章详细讲解了声明式事务(@Transactional注解)和编程式事务(TransactionTemplate、PlatformTransactionManager)的区别与用法,并探讨了事务传播行为(如REQUIRED、REQUIRES_NEW等)及隔离级别(如READ_COMMITTED、REPEATABLE_READ)。
302 1
|
监控 Java 数据库
Spring事务相关配置、案例:转账业务追加日志及事务传播行为
Spring事务相关配置、案例:转账业务追加日志及事务传播行为
157 0
|
11月前
|
Java 开发者 Spring
Spring高手之路24——事务类型及传播行为实战指南
本篇文章深入探讨了Spring中的事务管理,特别是事务传播行为(如REQUIRES_NEW和NESTED)的应用与区别。通过详实的示例和优化的时序图,全面解析如何在实际项目中使用这些高级事务控制技巧,以提升开发者的Spring事务管理能力。
259 1
Spring高手之路24——事务类型及传播行为实战指南
|
10月前
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。