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

Spring Boot 中使用 @Transactional 注解配置事务管理 下面分别介绍一下的几个属性。 阅读详情

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

@Service
@Transactional(readOnly = true)
public class AppTradeRec2Service extends BaseService {
	@Autowired
	private AppTradeRecDao appTradeRecDao;
	@Autowired
	private ConsInfoDao consInfoDao;
	
	@Transactional(readOnly = false)
	public void payCharge(TradeRec tradeRec) {
		User usr = UserUtils.getUser();
		ConsInfo cons = consInfoDao.getByUser(usr.getId());
		//修改交易记录
		tradeRec.setPayBefore(cons.getAccountAmt());
		tradeRec.setPayAfter(cons.getAccountAmt() - tradeRec.getRcvAmt());
		tradeRec.setIsPay("99");
		appTradeRecDao.save(tradeRec);
		//修改账户余额
		cons.setAccountAmt(cons.getAccountAmt() - tradeRec.getRcvAmt());
		consInfoDao.save(cons);
	}
}

一、readOnly读写事务控制

readOnly=true表明所注解的方法或类只是读取数据。
readOnly=false表明所注解的方法或类是增加,删除,修改数据。

二、isolation事务隔离级别

我们在使用事务过程中,通常会发生以下三种情况:

1、脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。

2、不可重复读(non-repeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。

3、幻像读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。

针对上述三种情况,Spring提供了5种事务隔离级别予以解决:

1、DEFAULT默认级别

DEFAULT为数据源(数据库)的默认隔离级别,以目前常用的MySQL为例,默认的隔离级别通常为REPEATABLE_READ。

2、READ_UNCOMMITTED未授权读取级别

这是最低的隔离级别,一个事务能读取到别的事务未提交的更新数据,很不安全,可能出现丢失更新、脏读、不可重复读、幻读。

3、READ_COMMITTED授权读取级别

以操作同一行数据为前提,读事务允许其他读事务和写事务,未提交的写事务禁止其他读事务和写事务。此隔离级别可以防止更新丢失、脏读,但不能防止不可重复读、幻读。此隔离级别可以通过“瞬间共享读锁”和“排他写锁”实现。

4、REPEATABLE_READ可重复读取级别

保证同一事务中先后执行的多次查询将返回同一结果,不受其他事务影响。以操作同一行数据为前提,读事务禁止其他写事务,但允许其他读事务,未提交的写事务禁止其他读事务和写事务。此隔离级别可以防止更新丢失、脏读、不可重复读,但不能防止幻读。 

5、SERIALIZABLE序列化级别

所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰。提供严格的事务隔离,此隔离级别可以防止更新丢失、脏读、不可重复读、幻读。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。

隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免更新丢失、脏读,而且具有较好的并发性能。尽管它会导致不可重复读、幻读这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

三、Propagation事务传播行为

Propagation属性用来枚举事务的传播行为。所谓事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。Spring支持7种事务传播行为,默认为REQUIRED。

1、REQUIRED

REQUIRED是常用的事务传播行为,如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。

2、SUPPORTS

SUPPORTS表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么这个方法会在这个事务中运行。

3、MANDATORY

MANDATORY表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常。不会主动开启一个事务。

4、REQUIRES_NEW

REQUIRES_NEW表示当前方法必须运行在它自己的事务中。一个新的事务将被启动,如果存在当前事务,在该方法执行期间,当前事务会被挂起(如果一个事务已经存在,则先将这个存在的事务挂起)。如果使用JTATransactionManager的话,则需要访问TransactionManager。

5、NOT_SUPPORTED

NOT_SUPPORTED表示该方法不应该运行在事务中,如果存在当前事务,在该方法运行期间,当前事务将被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager。

6、NEVER

NEVER表示当前方法不应该运行在事务上下文中,如果当前正有一个事务在运行,则会抛出异常。

7、NESTED

NESTED表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与REQUIRED一样。嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。

综上所述,NESTED和REQUIRES_NEW非常相似,都是开启一个属于它自己的新事务。使用REQUIRES_NEW时,内层事务与外层事务就像两个独立的事务一样,一旦内层事务进行了提交后,外层事务不能对其进行回滚。当内部事务开始执行时, 外部事务将被挂起, 内务事务结束时, 外部事务将继续执行。两个事务互不影响,两个事务不是一个真正的嵌套事务,同时它还需要JTA事务管理器的支持。

使用NESTED时,外层事务的回滚可以引起内层事务的回滚。而内层事务的异常并不会导致外层事务的回滚,它是一个真正的嵌套事务。嵌套事务开始执行时, 它将取得一个 savepoint,如果这个嵌套事务失败, 将回滚到此savepoint。潜套事务是外部事务的一部分, 只有外部事务结束后它才会被提交。

【实战揭秘】高胜率集合竞价抓涨停策略:融合MACD背离与斐波那契的量化模型 本文揭秘了一种高胜率集合竞价抓涨停策略,融合MACD背离与斐波那契数列的量化模型。通过量能异动、技术形态突破和资金共识形成的交叉验证,该策略在实盘中表现出色。文章详细解析了MACD背离的量化实现细节、斐波那契数列的实战应用,以及策略的量化建模过程,帮助投资者提升交易胜率。 阅读详情

相关推荐

【PMP认证考试之个人总结】第 4 章 项目范围管理

第 4 章 项目范围管理 4.1 综述   1.产品范围和项目范围的区别 ①产品范围:某项产品、服务或成果所具有的特性和功能; ②项目范围:为交付具有规定特性与功能的产品、服务或成果而必须完成的工作; 2.收集需求、定义范围和创建WBS输出的区别 ①收集需求 ===> 需求跟踪矩阵; ②定义范围 ===> 项目范围说明书;

qq296398300的博客 2892

SpringBoot @Transactional事务详解

当Java中一个方法内有多次对数据库的增删改查等操作,并且这些操作之间有一些关联关系,如果方法执行一半出问题报错,后面的操作将不会执行,造成数据异常,但是使用了事务以后可以如果中途执行失败,可以回退到方法执行之前,保证数据不出问题。事务要么全部都被执行,要么就全都不被执行,如果有子事务提交失败,那么其他子事务对数据库的操作将被回滚,数据库回到事务提交前的状态;注解,默认会回滚所有事务,前提下,一定要主动抛出异常,否则事务是不会生效的。下面是异常类和子类关系图,@Transactional,不加任何参数时,

Tongyao 4074

基-2 16点fft的verilog实现

本文是采用输入8位数据,输出8位数据的16点fft实现,旋转因子采用8位rom存储,分为cos和sin2个rom存储;输入数据以及每一级的输出数据采用8位的ram进行存储,分为实部和虚部进行存储。采用顺序输入,那么输出则为倒序。生成rom,可先在matlab中,计算出cos和sin的值,然后写入coe文件,再由ip核生成,具体过程自行百度,懒得百度的话,可以发我的邮箱来获得具体的程序。因为本文采用...

juniorofMFC的博客 9992

@Transactional开启事务以及@Transactional属性配置

@Transactional事务有如下可添加参数: 参数名 参数值 参数作用 noRollbackFor Class<? extends Throwable>[] 一组异常类,遇到时不回滚。默认为{} isolation 枚举org.springframework.transaction.annotation.Isolation的值 事务隔离级别 noRollbackForClassName Stirng[] 一组异常类名,遇到时不回滚,默认为{} propagati

weixin_44976835的博客 5692

PostgreSQL+Citus分布式集群实战:从零搭建到性能调优

本文详细介绍了如何从零开始搭建并优化PostgreSQL+Citus分布式数据库集群。内容涵盖集群规划、源码编译安装、Citus扩展部署、节点配置、分布式表创建以及核心性能调优策略,为应对海量数据增长提供了完整的部署指南和实战解决方案。

oo7890的博客 627

Vivado IP核调参大师:高效配置RS编码器的避坑指南

本文深入解析Vivado中RS编码器IP核的高效配置方法,涵盖符号宽度选择、码长优化和AXI4-Stream接口控制等关键参数。重点指导如何避开常见陷阱,实现FPGA设计中的资源优化与性能平衡,提升RS编码在通信系统中的可靠性。

metaverse5vr的博客 222

spring 事务-使用@Transactional 注解(事务隔离级别)

先看下@Transactional可以配制那些参数及以其所代表的意义。 isolation事务隔离级别,使用时一般如下。 @Transactional(isolation=Isolation.DEFAULT) public void method(){} isolation的参数有以下五种: 1_1、Isolation.DEFAULT:为数据源的默认隔离级别 1_2、isolation=Isolation.READ_UNCOMMITTED:未授权读取级别 以操作同一行数据为前提,读.

红袖添香的博客 1万+

如何在Ubuntu 22.04上为AlphaFold3配置NVIDIA A100 GPU(含驱动安装避坑指南)

本文提供了在Ubuntu 22.04系统上为AlphaFold3部署NVIDIA A100 GPU的完整安装教程。内容涵盖从系统环境准备、NVIDIA驱动安装与避坑指南,到Docker容器化部署、数据库获取以及最终构建运行AlphaFold3的详细步骤,旨在帮助研究者和开发者高效配置高性能计算环境,充分发挥A100的硬件潜力。

nft7creator的博客 468

@Transactional详解

@Transactional 是 Spring 框架中的一个注解,用于声明一个方法需要进行事务处理。通过在方法上加上 @Transactional 注解,表示该方法需要被包装成一个事务,并由 Spring 容器统一管理、控制和回滚事务。 @Transactional 注解可以用于类或方法级别上,并且可以指定特定的事务属性,如传播行为、隔离级别、是否只读等。也可以使用默认值,即使用默认的事务管理器和默认的事务属性。 使用 @Transactional 注解可以方便地在 Spring 中实现对目标方法的事务

Ascend1977的博客 4451

用Quartus II和LPM_ROM手把手复现西电计组课设:从微指令到五条指令的完整流程

本文详细介绍了使用Quartus II和LPM_ROM复现西电计组课设的完整流程,从微指令编写到五条指令的实现。通过环境搭建、LPM_ROM配置、微程序设计及调试技巧,帮助读者高效完成课程设计,避开常见问题。适合计组课程设计的学习者和实践者参考。

weixin_29288313的博客 457

STM32实战开发(71):STM32人脸识别开发教程:基于摄像头模块的人脸识别系统

在嵌入式系统中,STM32凭借其强大的计算性能、丰富的外设接口以及低功耗特性,成为了实现人脸识别系统的理想平台。STM32虽然没有强大的计算能力,但可以通过合理利用外部硬件加速模块,如DSP、GPU、FPGA等,结合轻量级的人脸识别算法,实现高效的人脸识别系统。尽管STM32的计算资源相对有限,但通过合理的优化和使用高效的算法,我们依然能够实现高效的人脸识别功能。在本项目中,我们使用。在STM32开发中,虽然处理能力有限,但通过优化算法和合理利用硬件加速,我们仍然可以实现一个轻量级的、实时的人脸识别系统。

2201_76125393的博客 1662

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

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

Carefree_State的博客 5625

潇洒郎: 小白一次性成功——红米 Note 12 5G Android12 系统13.0.16/14.0.9 小米红米手机解BL锁+ROOT-刷面具—官方ROM下载-线刷降级—解锁system系统分区

小白一次性成功——红米 Note 12 5G Android12 系统13.0.16/14.0.9 小米红米手机解BL锁+ROOT-刷面具—官方ROM下载-线刷降级—解锁system系统分区

潇洒郎的博客 4585

Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)

事务,就是一组操作数据库的动作集合。事务是现代数据库理论中的核心概念之一。如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务。当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交。由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态。

mcooiedo的博客 377

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【Spring】Spring事务和事务传播机制

Spring事务和事务传播机制

2403_87459748的博客 2835

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java外功精要(6)——Spring事务及其传播机制

Spring事务管理是Spring框架中用于确保数据库操作的核心机制。它通过或。

2401_89167985的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

qq_45441466的博客 2733

【事务】开发用到的事务,TransactionDefinition实例详解,事务的传播机制

是Spring框架中定义事务属性的接口。它提供了定义事务的各种属性和行为的方法,包括事务的隔离级别、传播行为、超时设置等。在Spring中,通过TransactionDefinition可以灵活地配置事务的行为,以满足不同业务场景的需求。

代码的魅力,根本走不出来 2766

Spring声明式事务@Transactional注解详解(事务)

前面讲过了如何使用使用xml中实现声明式事务,详见博客:Spring5_狂神(IOC,AOP,SpringMybatis,事务)https://blog.youkuaiyun.com/weixin_45433031/article/details/115976938 通过xml配置文件很不方便,那么现在我们来学习通过@Transactional注解实现Spring声明式事务 文章目录 一. 使用位置 二. 参数说明 三. 事务传播行为 四. 隔离级别 1. SQL标准规范 .

Java后端技术栈 9672

Spring 事务隔离级别 事务传播特性 @Transactional使用

spring的事务处理能力,本质上是数据库提供的。 一个数据库具备事务,那么它必然支持4个特性, 事务的4大特性 原子性 一致性 隔离性 持久性 这4个特性,保证了数据库处理单事务是有保障的,正确的。更多应用处理场景下,是多事务并行出现的。同时,两个或两个以上的事务,操作同一张表,就会引起冲突。为了解决事务间交互产生的问题,数据库设置了4个隔离级别 数据库的4大隔离级别 ...

chudaxiakkk的专栏 9116

【JavaEE】Spring事务

Spring事务的注解实现@Transaction,以及三个主要属性,异常回滚属性rollbackFor,事务隔离级别Isolation,事务传播机制propagation

yj20040627的博客 2763

spring事务的隔离级别和传播特性详解(附实例)

spring支持编程式事务管理和声明式事务管理两种方式。 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。 声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务...

小石潭记丶 3274

Spring 事务和事务传播机制

本文介绍了Spring事务的基本概念和实现方式。主要内容包括:1) 事务的定义和MySQL事务操作语法;2) Spring事务的两种实现方式:编程式事务和声明式事务;3) 重点讲解了声明式事务@Transactional注解的使用方法、作用范围和注意事项;4) 详细解析了@Transactional的三个重要属性:rollbackFor异常回滚规则、Isolation隔离级别和propagation传播机制。文章通过代码示例展示了事务的正确使用方式,并特别强调了异常处理对事务回滚的影响,提供了手动回滚事务的

phltxy的博客 1011
上一篇: Docker原理和基本使用
下一篇: Android贝塞尔曲线水纹波动效果、车辆监控效果
wangpf2011
博客等级 码龄16年 71粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值