Spring事务管理接口 + 实例

Spring入门到精通:第六章 Spring事务管理:5.事务操作-场景引入和Spring事务管理介绍 上面的代码,如果正常执行的话没有什么问题的,但是如果代码执行过程中出现异常的话就有很大的问题了,就会出现数据不一致了。 一、异常演示 我们在zhangsan扣减金额之后模拟一个异常来看下,代码如下: public void transferMoney() { //减少钱 accountDao.updateMoneyByName("zhangsan",new BigDecimal(-100)); //模拟异常... int i = 1/0;w ... 阅读详情

面试经常问到关于Spring事务的问题,包括怎么开启,开启原理等。现整理总结如下。

目录

1、Spring事务简介

2、Spring开启事务的主要接口介绍

2.1 TransactionDefinition

1)Spring五大隔离级别

2)Spring事务传播行为

2.2 PlatformTransactionManager

2.3 TransactionStatus

3、实例,代码实现开启事务


1、Spring事务简介

参考之前写的文章:Spring事务整理篇


2、Spring开启事务的主要接口介绍

Spring事务抽象一共有3个主要接口,他们都在org.springframework.transaction包下。

  • TransactionDefinition:负责定义事务相关属性,包括隔离级别、传播行为等。
  • PlatformTransactionManager:是Spring事务框架的核心接口,它为应用程序提供事务边界的统一方式,它根据TransactionDefinition的定义来开启相关事务。
  • TransactionStatus:事务开启期间的事务状态由TransactionStatus负责,也可以通过TransactionStatus对事务进行有限的控制。

下面分别分析这三个接口。


2.1 TransactionDefinition

负责定义事务相关属性,包括隔离级别、传播行为等。

详细参考文章: Spring五大隔离级别与事务传播属性 

1)Spring五大隔离级别

  • 默认 DEFAULT 

这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应。

  • 读未提交 READ_UNCOMMITTED 

这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读(读的时候可以更改)和幻像读(读的时候可以插入)。 

  • 读已提交 READ_COMMITTED

保证一个事务修改的数据提交后才能被另外一个事务读取,另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读(读的时候可以更改)和幻像读(读的时候可以插入)。 

  • 可重复 REPEATABLE_READ 

这种事务隔离级别可以防止脏读、不可重复读,但是可能出现幻像读(读的时候可以插入)。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了不可重复读。

  • 串行化 SERIALIZABLE

这是花费最高代价但是最可靠的事务隔离级别,事务被处理为顺序执行。除了防止脏读、不可重复读外,还避免了幻像读。

2)Spring事务传播行为

/*
默认的事务传播行为,如果存在当前事务,则加入,如果不存在事务,则创建一个新事务。
*/
int PROPAGATION_REQUIRED = 0;

/*
如果当前存在一个事务,则加入当前事务,如果不存在,则直接执行。
对于一些查询方法来说,PROPAGATION_SUPPORTS比较适合,如果当前方法被其他方法调用,而其他方法启动了一个事务,此行为可以保证当前方法加入当前事务,并洞察当前事务对数据资源所做的更新。其他传播方式则看不到更新,因为当前事务没有提交。
*/
int PROPAGATION_SUPPORTS = 1;

/*
PROPAGATION_MANDATORY强制要求当前存在一个事务,如果不存在,则抛出异常。
*/
int PROPAGATION_MANDATORY = 2;

/*
不管当前是否存在事务, 都会创建一个新的事务。如果当前存在事务,会将当前事务挂起。如果某个业务对象不想影响外层事务,可以选择PROPAGATION_REQUIRES_NEW。
*/
int PROPAGATION_REQUIRES_NEW = 3;

/*
不支持当前事务,而是在没有事务的情况下执行。如果当前存在事务,则将当前事务挂起,但要看PlatformTransactionManager的实现类是否支持事务的挂起。
*/
int PROPAGATION_NOT_SUPPORTED = 4;

/*
永远不支持事务,如果存在事务,则抛出异常。
*/
int PROPAGATION_NEVER = 5;

/*
如果存在事务,则在当前事务的一个嵌套事务中执行。与PROPAGATION_REQUIRES_NEW类似,但与PROPAGATION_REQUIRES_NEW创建的事务与原有事务为同一档次,在新事务运行时原有事务被挂起;PROPAGATION_NESTED创建的事务寄生在外层事务,地位比外层事务低,嵌套事务执行时外层事务也处于活跃状态。
*/
int PROPAGATION_NESTED = 6;

2.2 PlatformTransactionManager

总述:是Spring事务框架的核心接口,它为应用程序提供事务边界的统一方式,它根据TransactionDefinition的定义来开启相关事务。

Spring并不直接管理事务,而是提供了多种事务管理器 ,他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。

Spring事务管理器的接口是: org.springframework.transaction.PlatformTransactionManager ,通过这个接口,Spring为各个平台如JDBC、Hibernate等都提供了对应的事务管理器,但是具体的实现就是各个平台自己的事情了。

PlatformTransactionManager接口代码如下:

PlatformTransactionManager接口中定义了三个方法:

Public interface PlatformTransactionManager()...{ 
 // Return a currently active transaction or create a new one, according to the specified propagation behavior(根据指定的传播行为,返回当前活动的事务或创建一个新事务。)

 TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; 

 // Commit the given transaction, with regard to its status(使用事务目前的状态提交事务)
 Void commit(TransactionStatus status) throws TransactionException; 

 // Perform a rollback of the given transaction(对执行的事务进行回滚)
 Void rollback(TransactionStatus status) throws TransactionException; 
 } 

我们刚刚也说了Spring中PlatformTransactionManager根据不同持久层框架所对应的接口实现类,几个比较常见的如下图所示

 

 

比如我们在使用JDBC或者iBatis(就是Mybatis)进行数据持久化操作时,我们的xml配置通常如下:

	<!-- 事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<!-- 数据源 -->
		<property name="dataSource" ref="dataSource" />
	</bean>

 


2.3 TransactionStatus

TransactionStatus接口用来记录事务的状态 该接口定义了一组方法,用来获取或判断事务的相应状态信息。

PlatformTransactionManager.getTransaction(…) 方法返回一个 TransactionStatus 对象。返回的TransactionStatus 对象可能代表一个新的或已经存在的事务(如果在当前调用堆栈有一个符合条件的事务)。

TransactionStatus接口内容如下:

public interface TransactionStatus{
 boolean isNewTransaction(); // 是否是新的事务
 boolean hasSavepoint(); // 是否有恢复点
 void setRollbackOnly(); // 设置为只回滚
 boolean isRollbackOnly(); // 是否为只回滚
 boolean isCompleted; // 是否已完成
} 

 


3、实例,代码实现开启事务

1)参考:Spring 事务用法示例与实现原理

首先通过一个简单的例子讲解了Spring事务是如何使用的,然后讲解了Spring事务进行标签解析的时候做了哪些工作,最后讲解了Spring事务是如何与Spring Aop进行一一对应的,并且是如何通过Spring Aop实现将事务逻辑织入目标bean的。

  • 1. 使用示例
  • 2. 标签解析
  • 3. 实现原理
  • 4. 小结

2)参考:https://www.jianshu.com/p/00b46f2f397c  

包含常见的JDBC、Hibernate数据访问方式。

 

 

 

S32K344开发环境搭建全攻略:S32DS 3.5.12与RTD 3.0.0实战指南 在嵌入式开发中,集成开发环境(IDE)与实时驱动(RTD)的协同配置是项目启动的关键。S32DS作为NXP官方IDE,结合RTD包,为S32K3系列提供底层驱动支持。正确安装与路径配置能确保编译、调试与烧录流程顺畅,避免常见错误。该环境适用于汽车电子、工业控制等场景,如车身域控、BMS。本文基于S32K344芯片,详细记录从软件下载到调试的完整过程,帮助开发者快速搭建稳定开发环境。 阅读详情

相关推荐

基于Hadoop生态的大数据异常检测平台搭建

批处理:用Spark MLlib的LOF(局部异常因子,适合高密度数据)、(单类支持向量机,适合高维数据);流处理:用Flink ML的(实时聚类,检测离群点)、ADWIN(自适应滑动窗口,处理概念漂移)。数据层:用Flume/Kafka采集数据,HDFS存储,Hive管理元数据;计算层:用Spark处理离线批数据,Flink处理实时流数据;算法层:用孤立森林(批)、3σ原则(流)检测异常;可视化层:用Grafana做仪表盘,Prometheus+Alertmanager报警。这个平台能处理。

软件工程实践的博客 933

以JMeter登录录制脚本为例,让大家搞懂事务和单一接口的关系

绝大多数刚刚入门性能测试的小伙伴都分不清事务和具体请求的关系,那么今天我就用一个登录的实例让大家彻底理解二者的区别!话不多说直接上例子!

自动化测试技术栈 410

二维码扫描与页面跳转的完整流程解析

本文详细解析了二维码扫描与页面跳转的完整流程,从核心原理到前后端实现,涵盖了二维码生成、扫码事件处理、后端验证机制及跳转逻辑等关键环节。特别介绍了如何使用qrcode.js生成二维码、WebSocket处理扫码状态以及JWT令牌验证设计,帮助开发者构建安全高效的扫码跳转系统。

cicd6pipeline的博客 1089

Spring事务

在⼀个业务流程当中,通常需要多条DML(insert delete update)语句共同联合才能完成,这 多条DML语句必须同时成功,或者同时失败,这样才能保证数据的安全。多条DML要么同时成功,要么同时失败,这叫做事务。

程序员一博 1493

小红书爬取实战指南

以上方案仅供技术学习参考,请确保遵守目标网站的服务条款和相关法律法规。

monk all the way 6923

保姆级教程:在ESXi 8.0上为NVIDIA ConnectX-5/6网卡开启SR-IOV(从BIOS到虚拟机配置)

本文提供在ESXi 8.0上为NVIDIA ConnectX-5/6网卡开启SR-IOV的详细教程,涵盖BIOS设置、固件配置、驱动优化及虚拟机部署。通过SR-IOV技术,显著提升虚拟化环境中的网络性能,适用于高性能计算、AI训练等场景。

weixin_26934905的博客 455

Spring 事务管理方案和事务管理器及事务控制的API

Spring依赖事务管理器进行事务管理,事务管理器即一个通知类,我们为该通知类设置切点为service层方法即可完成事务自动管理。由于不同技术操作数据库,进行事务操作的方法不同。如:JDBC提交事务是 connection.commit() ,MyBatis提交事务是 sqlSession.commit() ,所以Spring提供了多个事务管理器。事务管理器名称作用针对JDBC技术提供的事务管理器。适用于JDBC和MyBatis。针对于Hibernate框架提供的事务管理器。

qq_53317005的博客 3487

基于NE555的触摸延时开关电路设计与实现

本文详细介绍了基于NE555芯片的触摸延时开关电路设计与实现方法。通过分析NE555的单稳态工作模式,结合定时电阻、电解电容等关键元件选型,提供了一套完整的电路搭建方案。文章还包含抗干扰设计、调试技巧及常见故障处理,帮助电子爱好者快速掌握触摸延时灯的制作要点。

weixin_29268267的博客 788

Spring(五):事务,使用注解+使用aspectj

1.事物简介 1.1什么是事务 讲mysql的时候,提出了事务。 事务是指一组sql语句的集合, 集合中有多条sql语句,可能是insert , update ,select ,delete, 我们希望这些多个sql语句都能成功,或者都失败, 这些sql语句的执行是一致的,作为一个整体执行。 1.2 什么时候想到使用事务 当我的操作,涉及得到多个表,或者是多个sql语句的insert,update,delete。需要保证这些语句都是成功才能完成我的功能,或者都失败,保证操作是符合要求的。 1.3事务用在哪里

qq_41984117的博客 816

【YOLOv26 源码深度解析】第三章:YOLOv26特征融合(Neck)模块

路径聚合网络作为YOLOv26 Neck部分的核心组件,在继承特征金字塔网络(FPN)自顶向下语义传播能力的基础上,引入了自底向上的路径增强机制,构建起双向跨层特征融合体系。该架构通过建立多尺度特征间的双向信息流,有效缓解了深层网络中细节信息逐层衰减的问题,使得模型在保持高层语义理解能力的同时,能够精确定位不同尺度的目标实例。跨层深度监督的另一优势在于增强特征的尺度适应性。对于来自上层路径的特征与横向连接的特征,融合过程首先对各路特征进行加权,随后进行归一化处理,最终通过加法或拼接操作生成融合特征。

u012133341的博客 520

【动态导通电阻】GaN功率器件中动态导通电阻退化的机制、表征及建模方法

研究目的:鉴于动态RON退化对GaN功率器件性能的显著影响,本文旨在全面综述和讨论GaN功率器件中动态RON退化的机制、表征方法、建模技术以及解决方案,以期为GaN功率器件的设计、优化和应用提供理论指导和实践参考。内容概述:文章首先分析了缓冲层陷阱和栅极不稳定导致动态RON退化的物理机制,并通过物理基础的TCAD模拟与高压背栅测量结果进行对比,揭示缓冲层陷阱的充电/放电过程如何影响动态RON。接着,讨论了不同GaN器件技术中栅极不稳定引起的动态RON增加以及栅极过驱动的作用。

荷塘阅色 1166

Spring事务核心接口:PlatformTransactionManager

PlatformTransactionManager是Spring框架中事务管理的核心接口,它负责管理事务的创建、提交和回滚等操作。在Spring中,事务管理是通过PlatformTransactionManager和TransactionManager接口来实现的。PlatformTransactionManager是一个更高级的接口,它封装了TransactionManager接口,提供了更丰富的事务管理功能。

five-five 5002

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring Boot多实例环境下,双向数据交互接口的数据一致性和事务管理方案

本文针对Spring Boot多实例环境下双向数据交互的一致性与事务管理,提供系统方案。强一致性方案适用于金融交易等核心场景,含Seata AT模式(无侵入两阶段提交)和TCC模式(手动补偿);最终一致性方案适用于物流通知等场景,包括消息队列+本地事务及Saga模式,强调幂等性。解决了循环调用(标识+熔断)和写冲突(乐观锁、分布式锁)问题,涵盖监控与故障恢复,给出选型建议,助力构建高可用系统。

qq_39561614的博客 1240

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

spring事务&综合小实例

spring事务+综合小实例1.事务管理的核心接口2.事务相关接口2.1PlatformTransactionManager2.2TransactionDefinition2.3TransactionStatus3.基于注解方式配置3.1配置元素3.2例子3.2.1创建一个spring项目3.2.2创建Java文件3.2.3xml文件3.2.4运行结果4.总结 1.事务管理的核心接口 spring...

a18792721831的博客 1036

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

spring事务管理(详解和实例)

目录 1 理解spring事务 2 核心接口 2.1 事务管理器 2.1.1 JDBC事务 2.1.2 Hibernate事务 2.1.3 Java持久化API事务(JPA) 2.1.4 Java原生API事务 2.2 基本事务属性的定义 2.2.1 传播行为 2.2.2 隔离级别 2.2.3 只读 2.2.4 事务超时 2.2.5 回滚规则 2.3 事务状态 3 编程式事务 3.1 编程式和声明式事务的区别 3.2 如何实现编程式事务? 3.2.1 使用Transact

mocas_wang的博客 7704

Spring 学习之路--Spring的事务管理学习笔记

声明式事务管理最大的优点在于开发者无须通过编程的方式来管理事务,只需在配置文件中进行相关的事务规则声明,就可以将事务规则应用到业务逻辑中。

LiangPi的博客 565

Spring 中的事务管理

1 什么是事务? 事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。 2 事务的四个特性 原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。 一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须...

Geffin的博客 367

Spring 事务管理

介绍 Spring 的事务管理,包括事务的概念、事务的五大属性及其细节。

Jacks丶的博客 396

spring事务管理实例

简介 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事物的特性(ACID): 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用; 一致性: 执行事务前后,数据保持一致; 隔离性: 并发访问数据库时,一个用户的事物不被其他事物所干扰,各并发事务之间数据库是独立的; 持久性: 一个事务被提交之后。它对数据库中数据的改变是持...

北眼的博客 565

Spring事务管理

一、什么是事务   事务:指逻辑上的一组操作,这组操作要么全部成功,要么全部失败。有以下特性: ①原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 ②一致性:事务前后数据的完整性必须保持一致(张三给李四转账,张三+李四的总额不变)。 ③隔离性:多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务干扰,多个并发事务之间的数据相互隔离。 ④持久性:一个事...

143

Spring的事务管理

一、Spring事务的概述 Spring事务机制主要包括声明式事务和编程式事务。 一个业务逻辑方法往往包括一系列数据库原子访问操作,并且这些数据库原子访问操作应该绑定成一个整体,即要么全部执行,要么全部不执行,通过这种方式我们可以保证数据库的完整性,这就是事务。 事务是一个不可分割操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。 1.Spr...

xiayubao7788的博客 146

spring的事务管理

文章目录PlatformTransactionManager接口TransactionDefinìtion接口TransactionStatus接口事务管理的方式编程式事务管理声明式事务管理基于xml的声明式事务例子applicationContext.xmlCrudDao接口CrudDao接口的实现类基于注解的声明式事务例子 PlatformTransactionManager接口         此接口是spring提供的平

hayhead的博客 172

Spring的事务管理(特性、核心接口、并发问题、隔离级别、传播行为、基于xml文件配置、基于注解)

Spring的事务管理 Spring事务管理概述 事务的概述 什么是 事务 在数据库操作中,一项事务是由一条或多条操作数据库的SQL语句组成的一个不可分割的工作单元。当事务中的所有操作正常完成时,整个事务才能被提交到数据库中。如果当一项操作没有完成,则整个事务都会被回滚 事务的特性 原子性 原子性是指一个事务必须被视为一个不可分割的最小工作单元,只有事务中的所有数据库操作都执行成功,才算整个事务执行成功 一致性 一致性是指事务将数据库从一种状态转变为下一种一致的状态 隔离性 隔离性还可以被称为并

qq_48033003的博客 622

Spring进阶(五):Spring事务管理(详解+实例)

理解事务之前,先讲一个你日常生活中最常干的事:取钱。比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱;然后ATM出1000元钱。这两个步骤必须是要么都执行要么都不执行。如果银行卡扣除了1000块但是ATM出钱失败的话,你将会损失1000元;如果银行卡扣钱失败但是ATM却出了1000块,那么银行将损失1000元。所以,如果一个步骤成功另一个步骤失败对双方都不是好事,如果不管哪一个步骤失败了以后,整个取钱过程都能回滚,也就是完全取消所有操作的话,这对双方都是极好的。事务就

IT全栈 华强工作室 3433

Spring事务管理与传播机制详解以及使用实例

写这篇博客之前我首先读了《Spring in action》,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱。 比如你去ATM机取1000块钱,大体有两个步骤:...

mojolang 553
上一篇: ConcurrentHahMap 基于源码解析
下一篇: mysql事务隔离级别及原理
Longtermevolution
博客等级 码龄9年 113粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值