【事务】开发用到的事务,TransactionDefinition实例详解,事务的传播机制
【事务】开发中用到的事务,TransactionDefinition实例详解
- 一、TransactionDefinition 介绍
- 1、隔离级别(Isolation Level):
- 2、传播行为(Propagation Behavior):
- 3、超时设置(Timeout Setting):
- 4、只读属性(Read-Only):
- 5、名称(Name):
- 三、@Transactional 应用
- 二、TransactionDefinition 应用
- 三、注意事项
- 三、java其他常用的事务
一、TransactionDefinition 介绍
TransactionDefinition 是Spring框架中定义事务属性的接口。它提供了定义事务的各种属性和行为的方法,包括事务的隔离级别、传播行为、超时设置等。在Spring中,通过TransactionDefinition可以灵活地配置事务的行为,以满足不同业务场景的需求。
下面是TransactionDefinition接口中常用的属性和方法:
1、隔离级别(Isolation Level):
事务隔离级别常量 ISOLATION_DEFAULT、ISOLATION_READ_UNCOMMITTED、ISOLATION_READ_COMMITTED、ISOLATION_REPEATABLE_READ 和 ISOLATION_SERIALIZABLE 是 Java 中 TransactionDefinition 接口定义的隔离级别常量,用于表示事务的隔离级别。以下是这些隔离级别的具体含义:
-
ISOLATION_DEFAULT:
表示使用数据库默认的隔离级别。具体隔离级别取决于数据库的配置和默认设置。
-
ISOLATION_READ_UNCOMMITTED:
该隔离级别允许事务读取未提交的数据,也称为脏读(Dirty Read)。
其他事务可以修改并提交数据,但是在当前事务读取时尚未提交的数据也可被读取。 -
ISOLATION_READ_COMMITTED:
该隔离级别确保一个事务只能读取到已提交的数据,禁止脏读(Dirty Read)。
当一个事务正在读取数据时,其他事务对该数据进行修改并提交,当前事务再次读取该数据时会获取到已提交的最新值。 -
ISOLATION_REPEATABLE_READ:
该隔离级别确保一个事务在同一事务期间多次读取同一数据时,得到的结果是一致的,不会受其他事务的影响。
即使其他事务对数据进行了修改并提交,当前事务多次读取同一数据时仍会获取到一致的结果,避免了不可重复读(Non-Repeatable Read)问题。 -
ISOLATION_SERIALIZABLE:
该隔离级别是最高的隔离级别,确保所有事务按顺序串行执行,避免并发问题。
当一个事务在执行时,其他事务无法对其涉及的数据进行修改和提交,直到当前事务完成。
这些隔离级别可以根据业务需求和数据库支持的情况来选择合适的级别。一般来说,隔离级别越高,数据一致性和安全性越高,但也可能会影响系统的并发性能。因此,在选择隔离级别时需要根据具体情况进行权衡和考虑。
2、传播行为(Propagation Behavior):
int getPropagationBehavior():获取事务的传播行为,可以是PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER或PROPAGATION_NESTED之一。
3、超时设置(Timeout Setting):
int getTimeout():获取事务的超时时间,以秒为单位。如果超过指定时间事务未完成,则会自动回滚。
4、只读属性(Read-Only):
boolean isReadOnly():判断事务是否为只读事务。只读事务不会对数据库进行写操作,可以提高性能。
5、名称(Name):
String getName():获取事务的名称,用于标识事务。
通过使用TransactionDefinition接口,可以在Spring中灵活地配置和管理事务的各种属性,从而实现对数据库操作的精确控制和优化。
三、@Transactional 应用
@Transactional 是 Spring 框架中用于声明事务性方法的注解之一。通过在方法上添加 @Transactional 注解,可以告诉 Spring 在执行该方法时要开启事务,并根据注解的配置来管理事务的提交、回滚等操作。
以下是 @Transactional 注解的一些常见用法和示例:
基本用法:在方法上添加 @Transactional 注解,表示该方法应该在事务管理范围内执行。
import org.springframework.transaction.annotation.Transactional;@Service
public class UserService {@Autowiredprivate UserDao userDao;@Transactionalpublic void updateUser(User user) {// 执行更新用户操作userDao.update(user);}
}
在上面的示例中,updateUser 方法被标记为 @Transactional,意味着当调用这个方法时,Spring 会自动为其开启一个事务。
事务属性配置:@Transactional 注解支持配置各种事务属性,例如事务的隔离级别、传播行为、超时设置等。
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED, timeout = 30)
public void updateUser(User user) {// 执行更新用户操作userDao.update(user);
}
在这个示例中,@Transactional 注解配置了事务的隔离级别为 READ_COMMITTED,传播行为为 REQUIRED,超时时间为 30 秒。
异常回滚:默认情况下,@Transactional 注解会在方法抛出 RuntimeException 或其子类时回滚事务。你也可以通过 rollbackFor 属性指定需要回滚的异常类型。
@Transactional(rollbackFor = {SQLException.class, MyCustomException.class})
public void updateUser(User user) throws MyCustomException {// 执行更新用户操作userDao.update(user);if (somethingWentWrong) {throw new MyCustomException("Something went wrong!");}
}
在这个示例中,如果 updateUser 方法中出现 SQLException 或 MyCustomException 异常,事务会回滚。
总的来说,@Transactional 注解是 Spring 中用于声明事务性方法的便捷方式,通过注解配置可以灵活管理事务的行为和属性,使得事务管理更加方便和可控。
二、TransactionDefinition 应用
假设你正在开发一个基于Spring的Java项目,并且需要在其中使用TransactionDefinition来定义和管理事务属性。以下是一个示例代码,演示了如何在项目中使用TransactionDefinition:
首先,你需要在Spring的配置文件(如applicationContext.xml)中配置事务管理器和数据源:
<!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/><property name="username" value="username"/><property name="password" value="password"/>
</bean><!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean>
接下来,假设你有一个Service层的类UserService,其中包含了一些对用户数据进行操作的方法,需要使用事务管理:
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;public class UserService {private PlatformTransactionManager transactionManager;public void setTransactionManager(PlatformTransactionManager transactionManager) {this.transactionManager = transactionManager;}public void updateUser(User user) {// 定义事务属性TransactionDefinition def = new DefaultTransactionDefinition();TransactionStatus status = transactionManager.getTransaction(def);try {// 执行更新用户操作userDao.update(user);// 提交事务transactionManager.commit(status);} catch (Exception e) {// 发生异常时回滚事务transactionManager.rollback(status);throw new RuntimeException("更新用户失败", e);}}
}
在上面的示例中,UserService 类中的 updateUser 方法使用了 TransactionDefinition 来定义事务属性,包括事务的隔离级别、传播行为等。在方法中,首先获取事务管理器并使用事务定义开始事务,然后执行更新用户操作,最后根据操作结果提交或回滚事务。
在实际项目中,你可以根据具体业务需求和数据操作情况,灵活地配置和使用 TransactionDefinition来管理事务,保证数据操作的一致性和完整性。
三、注意事项
一定要注意!!!
spring 事务处理中,同一个类中:A方法(无事务)调B方法(有事务),事务不生效问题。
关注我,下周更新解决办法~
在使用事务时,有一些注意事项可以帮助你确保事务管理的正确性和可靠性:
- 事务边界:确保事务的边界设置正确,即事务应该包含逻辑上相关的操作,并且不应该跨越多个业务逻辑边界。
- 事务管理位置:在合适的位置使用事务管理,通常是在 Service 层或业务逻辑层进行事务管理,而不是在控制器(Controller)层或DAO层。
- 事务传播行为:根据业务需求和操作的情况,选择适当的事务传播行为。例如,如果一个方法调用另一个带有事务的方法,可以使用 Propagation.REQUIRED 传播行为。
- 事务隔离级别:根据业务的并发访问情况和数据一致性要求,选择合适的事务隔离级别。常用的隔离级别包括 Isolation.READ_COMMITTED 和 Isolation.REPEATABLE_READ 等。
- 异常处理:在事务中对异常进行处理,确保发生异常时事务可以正确回滚。可以使用 rollbackFor
属性指定需要回滚的异常类型,或者在方法中捕获异常并手动回滚事务。 - 事务超时:根据业务操作的耗时情况,设置适当的事务超时时间,避免事务长时间持有数据库连接。
- 只读事务:对于只读操作,使用 @Transactional(readOnly = true) 注解来声明只读事务,可以提高性能。
- 避免长事务:尽量避免长时间持有事务,以减少数据库锁定时间和资源占用。
- 并发控制:对于需要并发控制的操作,使用乐观锁或悲观锁等技术来确保数据一致性。
- 事务测试:在开发过程中进行事务的单元测试,验证事务管理的正确性和可靠性。
三、java其他常用的事务
在Java开发中,事务是管理数据库操作的重要概念之一。以下是在Java开发中常用的事务相关技术和工具:
-
Java Transaction API (JTA):
JTA 是 Java 平台的事务管理 API,用于管理分布式事务。它提供了 UserTransaction 接口来控制事务的开始、提交和回滚操作。
-
Java Persistence API (JPA):
JPA 是一种用于对象持久化的Java标准。它可以与 JTA 结合使用,通过注解或 XML 配置来管理实体类的持久化操作,包括事务管理。
-
Spring Framework:
Spring 框架提供了广泛的事务管理支持。通过 Spring 的声明式事务管理(Declarative Transaction Management)或编程式事务管理(Programmatic Transaction Management),可以很方便地管理事务。
-
Java Database Connectivity (JDBC):
JDBC 是 Java 提供的用于与数据库交互的标准 API。它可以通过设置事务隔离级别和使用 Connection 对象的 commit()、rollback() 方法来实现事务管理。
-
Spring Data JPA:
Spring Data JPA 是 Spring 框架的一个模块,提供了对 JPA 的更高级别的抽象和简化。它可以与 Spring 的事务管理结合使用,简化数据访问层的开发,并自动处理事务。
-
Hibernate:
Hibernate 是一个流行的 ORM 框架,它可以与 JTA 或 Spring
的事务管理结合使用,实现对数据库操作的事务管理和持久化。 -
Atomikos:
Atomikos 是一个分布式事务管理器,可以用于管理跨多个数据库或系统的事务。它提供了可靠的事务管理和故障恢复机制。
这些技术和工具可以根据具体的项目需求和开发环境选择和组合使用,以实现有效的事务管理和数据库操作。
相关文章:
【事务】开发用到的事务,TransactionDefinition实例详解,事务的传播机制
【事务】开发中用到的事务,TransactionDefinition实例详解 一、TransactionDefinition 介绍1、隔离级别(Isolation Level):2、传播行为(Propagation Behavior):3、超时设置(Timeout …...
Linux信号处理
Linux信号处理 什么是linux信号 本质是一种通知机制,用户 or 操作系统通过发送一定的信号,通知进程,某些事情已经发生,你可以在后续进行处理。 信号产生是随机的,进程可能正在忙自己的事情,所以…...
nuclei使用方法
nuclei使用方法 查看帮助 nuclei -h 列出所有模板 nuclei -tl 查找某种cms的相关漏洞模板,wordpress为例 nuclei -tl -tc "contains(name,wordpress)"便会列出内容里含有wordpress关键字的漏洞检测模板 使用与某cms相关的所有漏洞模板进行扫描&#…...
【并查集专题】【蓝桥杯备考训练】:网络分析、奶酪、合并集合、连通块中点的数量、格子游戏【已更新完成】
目录 1、网络分析(第十一届蓝桥杯省赛第一场C A组/B组) 2、奶酪(NOIP2017提高组) 3、合并集合(模板) 4、连通块中点的数量(模板) 5、格子游戏(《信息学奥赛一本通》…...
数据结构(三)复杂度的深层次剖析
之前发布了数据结构(一),很多同学反响不够清晰,那今天就发一篇对复杂度专题的博客,希望对大家理解复杂度提供一些帮助。 时间复杂度 我们先来一个理解一个复杂度,二分查找的复杂度(之前写过二…...
JavaWeb -- HTTP -- WEB服务器TOMCAT
一.HTTP介绍: HTTP(Hyper Text Protocol) 实际上是一种超文本传输的协议,规定了浏览器跟服务器之间的一些数据传输的规则 例如B/S 对于浏览器的请求,以及相应服务器的响应,都必须依靠这种协议,规范,才能够彼此之间相互 理解 HTTP的协议特点: 1.基于TCP协议: 面向连接 更加安全…...
GitHub与Git命令使用笔记
GitHub与Git命令使用笔记 文章目录 GitHub与Git命令使用笔记上传本地的新项目到github1. 创建新的GitHub仓库2. 初始化本地项目目录3. 将本地仓库关联到GitHub4. 推送本地代码到GitHub上传本地项目到GitHub时发生冲突 将默认分支名称从master改为maingit 把远程项目拉到本地&am…...
二叉树的层次遍历经典问题-算法通关村
二叉树的层次遍历经典问题-算法通关村 1 层次遍历简介 广度优先在面试里出现的频率非常高,整体属于简单题。广度优先又叫层次遍历,基本过程如下: 层次遍历就是从根节点开始,先访问根节点下面一层全部元素,再访问之后…...
SQLiteC/C++接口详细介绍sqlite3_stmt类(十二)
返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(十一) 下一篇: SQLiteC/C接口详细介绍sqlite3_stmt类(十三) 48、sqlite3_stmt_isexplain sqlite3_stmt_is…...
大模型时代如何做安全?
现在应该没人怀疑AI时代的到来了吧,在HUB上每天100的新的预训练模型产生,不夸张的说的,现在稍微有点计算机基础的人都可以训练自己的模型了。 说远了,还是说说那些不争气的安全厂商吧。为啥只说安全厂商?因为国内还是…...
新型储能是什么,储能系统解决方案现状及趋势详细说明
新型储能是指新兴的能够存储电能并在需要时释放的储能技术。其中主要包括光伏储能和商业储能。 光伏储能是指通过光伏电池将太阳能转化为电能,并将其存储起来以供后续使用。光伏储能系统一般由太阳能电池板、储能装置和逆变器组成。光伏储能可以将白天产生的电能存…...
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
在Go语言中,字典通常指的是map类型,它是一种用于存储键值对的数据结构。字典在Go中非常常见,是一种高效的数据结构,用于快速查找和检索数据。 字典的详细使用方法 创建字典 可以使用make函数来创建字典,并指定键值对…...
Flutter-仿携程首页类型切换
效果 唠叨 闲来无事,不小心下载了携程app,还幻想可以去旅游一番,奈何自己运气不好,自从高考时第一次吹空调导致自己拉肚子考试,物理,数学考了一半就交卷,英语2B铅笔除了问题,导致原…...
C语言 自定义类型:结构体
目录 前言 一、结构体类型 1.1 结构体的声明 1.2 结构体变量的创建和初始化 1.3 结构体的特殊声明 1.4 结构体的自引用 二、结构体的对齐 2.1 对齐规则 2.2 内存对齐的原因 2.3 修改默认对齐数 2.4 结构体传参 三、结构体实现位段 3.1 位段的内存分配 3.2 段的跨平…...
计算机网络拓扑结构
目录 <网络拓扑结构概念> <典型的拓扑结构介绍> 第一种,总线型网络拓扑结构 第二种,星型网络拓扑结构 第三种,树型网络拓扑结构 第四种,环型网络拓扑结构 第五种,网状型网络拓扑结构 第六种&#…...
FPGA通过I2C控制AT24C64
文章目录 前言一、代码设计框图二、IIC_drive模块设计2.1、模块接口:2.2、代码功能描述:2.3、IIC协议实现过程: 三、EEPROM_ctrl模块设计3.1、模块接口:3.2、代码功能描述 四、EEPROM_drive模块五、iic_top模块 前言 继上一篇FPG…...
134. 加油站(力扣LeetCode)
文章目录 134. 加油站题目描述暴力枚举(超时)代码一代码二(优化) 贪心算法方法一方法二 134. 加油站 题目描述 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&…...
XSKY 智能存储,助力“数据要素 X”先进制造
3 月 21-22 日,主题为“突破 智行”的 IMC2024 第七届中国智造数字科技峰会在重庆召开。作为在先进制造领域拥有领先存储解决方案以及众多应用实践的企业,星辰天合受邀参加了此次峰会并荣获大会颁发的“最佳存储解决方案奖”。同时,星辰天合先…...
数据挖掘与分析学习笔记
一、Numpy NumPy(Numerical Python)是一种开源的Python库,专注于数值计算和处理多维数组。它是Python数据科学和机器学习生态系统的基础工具包之一,因为它高效地实现了向量化计算,并提供了对大型多维数组和矩阵的支持…...
linux docker镜像初始化
linux docker镜像初始化 简介 有的镜像内部使用的linux系统特别精简,许多常用命令无法安装,导致排查问题较为困难。 可以使用cat /etc/os-release查看容器使用的linux版本,再进行一些常用操作的初始化。 Debian # 设置镜像源 RUN rm -f /…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
