【事务】开发用到的事务,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 /…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...