从@Transactional看事务的传播和隔离

Spring——@Transactional事务注解原理及失效场景 Spring中的事务注解你真的用对了吗?其中的原理、传播机制、失效场景你都理解了吗 阅读详情

spring如何处理事务呢?下面是个伪代码示意:

	  begin Transactional;
       try{
           //TODO
           commit;
       }catch (Throwable e){
           if(e属于该提交的(即noRollbackFor指定)的异常类型){
               commit;
           }else {
               rollback;
           }
       }

1. transactionManager 当在配置文件中有多个TransactionManager,可以用该属性指定使用哪个事务管理器

如果要配置全局事务管理,参考这篇文章全局性事务控制如何在springboot中配置

2. 事务的传播行为(propagation) ,默认值为REQUIRED

  • Propagation.REQUIRED
    默认传播行为 如果有事务那么加入此事务,没有就新建一个事务
	/**
	 * Support a current transaction, create a new one if none exists.
	 * <p>This is the default setting of a transaction annotation.
	 */
  • Propagation.SUPPORTS
    如果其他bean调用这个方法,在其他bean中声明了事务那么久加入事务,如果其他bean中没有声明事务就不用事务
	/**
	 * Support a current transaction, execute non-transactionally if none exists.
	 * <p>Note: For transaction managers with transaction synchronization,
	 * PROPAGATION_SUPPORTS is slightly different from no transaction at all,
	 * as it defines a transaction scope that synchronization will apply for.
	 * As a consequence, the same resources (JDBC Connection, Hibernate Session, etc)
	 * will be shared for the entire specified scope. Note that this depends on
	 * the actual synchronization configuration of the transaction manager.
	 */
  • Propagation.REQUIRES_NEW
    不管是否存在事务,都创建一个新的事务。如果已经存在一个事务就停止他
	/**
	 * Create a new transaction, suspending the current transaction if one exists.
	 * <p><b>NOTE:</b> Actual transaction suspension will not work out-of-the-box
	 * on all transaction managers. This in particular applies to
	 * {@link org.springframework.transaction.jta.JtaTransactionManager},
	 * which requires the {@code javax.transaction.TransactionManager} to be
	 * made available it to it (which is server-specific in standard Java EE).
	 * <p>A {@code PROPAGATION_REQUIRES_NEW} scope always defines its own
	 * transaction synchronizations. Existing synchronizations will be suspended
	 * and resumed appropriately.
	 */
  • Propagation.NOT_SUPPORTED
    不为这个方法开启事务
	/**
	 * Do not support a current transaction; rather always execute non-transactionally.
	 * <p><b>NOTE:</b> Actual transaction suspension will not work out-of-the-box
	 * on all transaction managers. This in particular applies to
	 * {@link org.springframework.transaction.jta.JtaTransactionManager},
	 * which requires the {@code javax.transaction.TransactionManager} to be
	 * made available it to it (which is server-specific in standard Java EE).
	 * <p>Note that transaction synchronization is <i>not</i> available within a
	 * {@code PROPAGATION_NOT_SUPPORTED} scope. Existing synchronizations
	 * will be suspended and resumed appropriately.
	 */
  • Propagation.MANDATORY
    必须当前存在事务,否则抛出异常
	/**
	 * Support a current transaction, throw an exception if none exists.
	 * Analogous to EJB transaction attribute of the same name.
	 */
  • Propagation.NEVER
    必须当前没有事务,否则抛出异常,与Propagation.MANDATORY相反
	/**
	 * Execute non-transactionally, throw an exception if a transaction exists.
	 */
  • Propagation.NESTED
    如果当前存在事务,则在嵌套事务中执行,类似于ROPAGATION_REQUIRED
	/**
	 * Execute within a nested transaction if a current transaction exists,
	 * behave like PROPAGATION_REQUIRED else. There is no analogous feature in EJB.
	 * <p>Note: Actual creation of a nested transaction will only work on specific
	 * transaction managers. Out of the box, this only applies to the JDBC
	 */

嵌套事务中发生异常会回滚到savePoint,不对主事务之前的操作产生影响,但提交还要依赖主事务的成功。
在这里插入图片描述

3.事务的隔离( isolation)

  • DEFAULT使用数据库默认的级别
    postgres数据库的默认隔离级别是已提交读 ,MySQL的默认事务隔离级别是可重复读。
  • READ_UNCOMMITTED 未提交读
	 A constant indicating that dirty reads, non-repeatable reads and phantom reads
	 * can occur. This level allows a row changed by one transaction to be read by
	 * another transaction before any changes in that row have been committed
	 * (a "dirty read"). If any of the changes are rolled back, the second
	 * transaction will have retrieved an invalid row.
  • READ_COMMITTED 已提交读
	 A constant indicating that dirty reads are prevented; non-repeatable reads
	 * and phantom reads can occur. This level only prohibits a transaction
	 * from reading a row with uncommitted changes in it.
  • REPEATABLE_READ 可重复读
		A constant indicating that dirty reads and non-repeatable reads are
	 * prevented; phantom reads can occur. This level prohibits a transaction
	 * from reading a row with uncommitted changes in it, and it also prohibits
	 * the situation where one transaction reads a row, a second transaction
	 * alters the row, and the first transaction rereads the row, getting
	 * different values the second time (a "non-repeatable read").
  • SERIALIZABLE 串行化
     A constant indicating that dirty reads, non-repeatable reads and phantom
	 * reads are prevented. This level includes the prohibitions in
	 * {@code ISOLATION_REPEATABLE_READ} and further prohibits the situation
	 * where one transaction reads all rows that satisfy a {@code WHERE}
	 * condition, a second transaction inserts a row that satisfies that
	 * {@code WHERE} condition, and the first transaction rereads for the
	 * same condition, retrieving the additional "phantom" row in the second read.

幻读和不可重复读相似容易混淆,幻读指的是第一个事务相同查询条件的查询行数,另一个事务增加或删除了某行(inserts a row),导致第一个事务两次查询的结果不同。不可重复读指的是另一个事务修改( alters the row)了某行的数据。

隔离和锁是不同的东西,隔离不是靠锁实现,是根据对数据的监控实现的,相比锁会回滚事务。

4. timeout 事务的超时时间 默认值为-1. 超时自动回滚

如果事务超过时间限制还没完成,就会回滚。
从方法执行开始计算。每个sql执行前检查一次是否超时,方法全部执行完毕后不检查是否超时。即设置事务超时为10秒,即使整个方法耗时20秒也不一定超时。

假设事务超时时间设置为2秒;假设sql执行时间为1秒;
如下调用是事务不超时的

public void testTimeout() throws InterruptedException {  
    System.out.println(System.currentTimeMillis());  
    JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);  
    jdbcTemplate.execute(" update test set hobby = hobby || '1'");  
    System.out.println(System.currentTimeMillis());  
    Thread.sleep(3000L);  
}  

而如下事务超时是起作用的:

public void testTimeout() throws InterruptedException {  
    Thread.sleep(3000L);  
    System.out.println(System.currentTimeMillis());  
    JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);  
    jdbcTemplate.execute(" update test set hobby = hobby || '1'");  
    System.out.println(System.currentTimeMillis());  
}  

參考博客

5. readOnly 是否为只读事务,默认值为false,即非只读事务

注意 在只读事务中修改数据库是会报错的!

6. rollbackFor 指定能够触发事务回滚的异常类型 noRollbackFor 指定那些异常类型不回滚事务

事务失效的场景

  1. 应用在非public方法上
  2. 同一个类中方法的调用
  3. 数据库引擎不支持事务,如innodb支持事务,而myisam就不支持事务
  4. 没有指定rollbackFor那些异常回滚时,spring默认的是运行时异常和error,如果不属于这些异常也就不会触发事务回滚。或者异常被catch掉了也不会触发事务回滚
  5. 传播机制设置为非事务方式
面试官:Spring@Transactional注解在什么情况下事务不生效? 这篇笔记来学习一下使用Spring框架的时候,@Transactional注解标注的方法在什么情况下事务不会生效。 我们可以写一个demo项目, 引入以下依赖 <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> 阅读详情

相关推荐

广工计组实验f2一位全加器

一位全加器实验

weixin_63692154的博客 2847

事务的传播和隔离

一、事物传播行为介绍:  1.@Transactional(propagation=Propagation.REQUIRED)  如果有事务, 那么加入事务, 没有的话新建一个(默认情况下) 2.@Transactional(propagation=Propagation.NOT_SUPPORTED)  容器不为这个方法开启事务 3.@Transactional(propagation=

jingweiben219的博客 353

Ubuntu22.04下3分钟搞定GitHub加速:SwitchHosts+小鱼工具保姆级配置指南

本文提供Ubuntu22.04下快速解决GitHub下载超时问题的保姆级教程,通过SwitchHosts图形化工具和小鱼一键换源工具实现高效加速。详细步骤包括环境准备、工具安装配置及验证方法,帮助开发者轻松优化GitHub访问速度,提升工作效率。

weixin_29258297的博客 567

@Transactional千万不要这样用!!踩坑了你都可能发现不了!!!

前阵子接手了一段同事之前的代码,里面用到了@transaction注解,了解Spring的小伙伴肯定知道,@Transactional是Spring提供的一种控制事务管理的快捷手段。但是我这段程序在运行的时候,经常出现莫名其妙的问题,连夜研究了好久才搞清楚,在这里记录一下, 避免大家入坑。

m0_71777195的博客 1612

【读代码】TradingAgents:基于多智能体LLM的金融交易框架深度解析

TradingAgents是由Tauric Research团队开源的创新型金融交易框架,其核心思想是通过多智能体协作系统模拟专业交易机构的决策流程。项目采用模块化设计,整合了LLM、实时数据分析、风险控制等组件,实现了从市场分析到交易执行的完整闭环。

kakaZhui的博客 2005

YOLOv13涨点改进| CVPR 2026 |独家创新首发、主干改进篇 |利用RIS-PiDiNet主干让YOLOv13更加强大!适合遥感目标检测、小目标检测、旋转目标检测,变化检测,图像分割涨点

🔥本文提出了一种改进的RIS-PiDiNet主干网络,通过引入几何先验构建几何一致性检测器,显著提升了模型在任意方向、结构规则目标场景下的检测性能。包含两个核心模块:S-PDC利用极谐变换的谐波核建模目标结构对称性,RIS-PDC通过SO(2)群平均实现旋转不变性。网络采用基于RIS-block的主干结构并融合轻量级LBP特征,增强了细粒度结构表达能力。实验表明,该方法特别适用于遥感和复杂几何分布场景,能有效提升目标检测的鲁棒性和精度。文章还详细介绍了如何将RIS-PiDiNet集成到YOLOv13框架

Ai缝合怪、助力小伙伴高效发论文 90

springboot中使用@Transactional注解事物不生效的原因(数据库事务隔离机制以及传播机制传播行为)

一:在springboot中使用事物遇到的坑 1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物。顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明。另一种是声明式事物,分为两种情况01:一种是通过传统xml方式配置,02:使用@Transaction注解方式配置,这是主要讲解的是通过注解方式配置。因为在springboot项目中,会自动配置DataSourceTransactionManager,我们只需要在对应的方法上或者类上加上@Transaction就会自动

zy103118的博客 3751

Spring AI Alibaba实战训练营-05模型输出质量评估

本文介绍了使用Spring AI Alibaba库评估AI模型输出质量的方案。项目通过5种评估器实现自动化评估:相关性评估、事实准确性评估、答案相关性评分、答案正确性评估和忠实度评估。开发步骤包括环境准备(Java 17、Maven、API Key获取)、创建Maven项目、配置Spring AI(通过环境变量安全设置API Key)以及实现RAG流程。重点强调了通过评估器自动检测AI输出的质量指标,帮助开发者优化AI应用性能。

program哲学 220

【JavaEE】Spring事务-@Transactional参数介绍-事务的隔离级别以及传播机制

本文重点讲解@Transactional的各个参数作用,尤其是其中的事务隔离级别isolation和事务传播机制propagation!

Carefree_State的博客 5625

【测开求职】面试题:计算机网络 详细版整理

本篇文章是笔者为准备研究生复试和校招而写,因此主要针对问答,注重理解,而不在于细节计算。读者可以先查看上面的链接走一遍计算机网络的整体框架结构。其中,重点难点以及易混淆的知识点,笔者会用其他文章进行了详述,在知识点处贴好了链接,有需要的可以查阅。

vector的博客 5937

时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测

时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测 目录时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测基本介绍ARIMAXVARVARMAVARMAXSESHWES参考资料 基本介绍 本文介绍ARIMAX、VAR、VARMA和VARMAX基本概念及其Python程序设计。 ARIMAX 具有外源回归量的自回归整合移动平均值(ARIMAX)是 ARIMA 模型的扩展,其还包括外生变量的建模。 外生变量也称为协变量,可以被认为是并行输入序列,其在与

前程算法屋的博客 6689

Spring 事务(编程式事务、声明式事务@Transactional、事务隔离级别、事务传播机制)

1. 在 Spring 项目中使用事务,有两种方式:编程式手动操作和声明式自动提交,声明式自动提交使用最多,只需要在方法上添加注解 @Transactional 2. 设置事务的隔离级别 @Transactional(isolation = Isolation.SERIALIZABLE),Spring 中的事务隔离级别有5种 3. 设置事务的传播机制 @Transactional(propagation = Propagation.REQUIRED),Spring 中的事务传播级别有 7 种

m0_58761900的博客 1万+

【Autosar从入门到精通到进阶实战篇】75 0x34/0x36/0x37:请求下载、传输数据、请求退出——刷写流程的“三兄弟”

文章摘要:UDS刷写流程0x34/0x36/0x37关键实现要点 本文通过一个真实ECU变砖案例,揭示了UDS刷写服务(0x34请求下载、0x36传输数据、0x37请求退出)的实现陷阱与最佳实践。核心要点: 安全架构设计: 0x34阶段只协商参数,不立即擦除Flash 采用缓冲区暂存数据,避免频繁写Flash 严格检查地址对齐和内存边界 关键改进措施: 实现数据包序列号校验(防错位) 传输层缓冲区溢出保护 0x37阶段必须包含完整性校验(如CRC32) 一次性批量写入Flash,减少擦写次数 典型错误模式:

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 72

Spring @Transactional 中的事务传播和隔离

20211030Spring @Transactional 中的事务传播和隔离 1.介绍 介绍 @Transactional 注释,以及它的隔离和传播设置。 2.什么是@Transactional? 可以使用@Transactional 将方法包装在数据库事务中。 它允许为事务设置传播、隔离、超时、只读和回滚条件。 还可以指定事务管理器。 2.1. @Transactional 实现细节 Spring 创建一个代理,或者操作类字节码,来管理事务的创建、提交和回滚。 在代理的情况下,Spring 会忽略内部方

盲目的拾荒者的博客 4563

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

使用 @Transactional 控制事务边界:传播和隔离解释

当我们谈论事务管理时,传播决定了事务的“边界”或“生命周期”,而隔离则定义了事务操作对其他并发事务的“可见性”。当调用带注解的方法时,Spring会动态创建一个代理,根据该方法的执行来处理事务的创建、提交和回滚。使用数据库时,尤其是在多个事务同时运行的系统中,由于多个事务操作访问同一组数据,数据完整性可能会面临风险。隔离级别确定一个事务中的操作与其他并发事务中的操作隔离的程度。例如,您可能希望一个方法始终在其事务中执行(使用REQUIRES_NEW),但根据所涉及的业务逻辑具有不同的隔离级别。

weixin_39292003的博客 630

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JavaEE进阶(12)Spring事务和事务传播机制:事务回顾、Spring中事务的实现、@Transactional详解(用法、rollbackFor、事务隔离级别、事务传播机制)

事务回顾(什么是事务?为什么需要事务?事务的操作)、Spring中事务的实现(Spring编程式事务、Spring声明式事务@Transactional)、@Transactional 详解(用法 、rollbackFor、事务隔离级别【MySQL事务隔离级别、Spring事务隔离级别】、Spring 事务传播机制【什么是事务传播机制事务的传播机制有哪些、Spring 事务传播机制使用和各种场景演示】)

m0_74343467的博客 1524

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

@Transactional事务的传播行为和隔离级别

事务传播行为和隔离级别

weixin_38417148的博客 2365

Spring声明式事务@Transactional 详解,事务隔离级别和传播行为

@Transactional注解支持9个属性的设置,这里只讲解其中使用较多的三个属性:readOnly、propagation、isolation。其中propagation属性用来枚举事务的传播行为,isolation用来设置事务隔离级别,readOnly进行读写事务控制。 一、readOnly读写事务控制 readOnly=true表明所注解的方法或类只是读取数据。 readOnly=false表明所注解的方法或类是增加,删除,修改数据。 二、isolation事务隔离级别 详细博文可参考:h

qq_45441466的博客 2734

Spring事务的传播机制和隔离级别,@Transactional失效的场景

若抛出受检异常需通过。Spring基于代理实现事务,非public方法无法被代理拦截。事务信息通过ThreadLocal存储,跨线程时事务上下文丢失。如MySQL的MyISAM引擎不支持事务,需使用InnoDB。代理无法覆盖final/static方法,导致事务失效。类内部方法调用(如A方法调用B方法),即使B方法有。需通过注入自身代理或拆分Bean解决。捕获异常后未重新抛出,事务无法感知异常。Spring定义了七种事务传播行为,通过。或XML未配置事务管理器。

qq_27288881的博客 329

Spring声明式事务@Transactional 详解,事务隔离级别isolation和事务传播行为Propagation

@Transactional注解支持9个属性的设置,这里只讲解其中使用较多的三个属性:readOnly、propagation、isolation。其中propagation属性用来枚举事务的传播行为,isolation用来设置事务隔离级别,readOnly进行读写事务控制。 @Service @Transactional(readOnly = true) public class AppTr...

wangpf2011的博客 6500

Spring事务——ACID、隔离级别、7种事务传播行为、注解@Transactional

1.什么是Spring事务 2.Spring事务的特性——ACID 原子性:事务作为最小的执行单位,不允许被分割,要么全部成功,要么全部失败; 一致性:事务执行前后,数据保持一致; 隔离性:并发访问数据库时,各并发事务之间是独立的,不会相互干扰; 持久性:一个事务被提交后,他对数据库的改变是持久的。 场景:张三给李四转账 1.张三账户有100,李四有100。两者一共有200; 2.张三给李四转50,这件事包括2个动作: 从张三账户-50; 给李四账户+50; 这2个动作必须同时成功才算转账成功,否则,全部

m0_38057941的博客 643

事务隔离级别和传播行为_Spring声明式事务@Transactional 详解,事务隔离级别和传播行为...

@Transactional注解支持9个属性的设置,这里只讲解其中使用较多的三个属性:readOnly、propagation、isolation。其中propagation属性用来枚举事务的传播行为,isolation用来设置事务隔离级别,readOnly进行读写事务控制。@Service@Transactional(readOnly=true)public class AppTradeRec2...

weixin_39628380的博客 114

@Transactional 事务的传播和隔离

使用步骤: 步骤一、在spring配置文件中引入<tx:>命名空间 <beans xmlns=”http://www.springframework.org/schema/beans” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns:tx=”http://www.springframework.org/...

熊浪的博客 1191

Spring 事务(事务、声明式事务@Transactional、事务隔离级别、事务传播机制)

如果中途遇到的异常,则回滚事务。Propagation.REQUIRES_NEW:表示创建⼀个新的事务,如果当前存在事务,则把当前事务挂起。事务A在读取数据的时候读取到了事务B尚未提交的数据,但是在过一会后事务B对A读取到的数据进行回滚了,那么A读取的数据就是脏读,读未提交侧重于查询,既然有了脏读,那么也肯定有不可重复读和幻读的问题。针对上面脏读的问题来解决的,事务A读到了事务B已经提交的数据,然后过了一会事务B将提交的数据进行修改了,此时事务A又读了一次B的数据,发现两次读到读到数据不一样,这个就叫不。

m0_62976995的博客 1298

【SpringBoot】Spring事务--详解@Transactional:rollbackFor、事务隔离级别(isolation)、事务传播机制(propagation))

本文详细解析了Spring框架中@Transactional注解的三个核心属性:rollbackFor、isolation和propagation。首先,通过转账案例演示了rollbackFor的作用机制,指出默认仅回滚RuntimeException和Error,需显式配置rollbackFor=Exception.class才能实现全异常回滚。其次,对比了MySQL的四种事务隔离级别与Spring的五种实现,强调默认Isolation.DEFAULT会继承数据库设置,并通过代码示例展示隔离级别的具体应用

Code哈哈笑的博客 1755
上一篇: CommandLineRunner、ApplicationRunner 接口
下一篇: netstat命令查看套接字信息
余生之君
博客等级 码龄10年 246粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值