【事务】开发用到的事务,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_DEFAULTISOLATION_READ_UNCOMMITTEDISOLATION_READ_COMMITTEDISOLATION_REPEATABLE_READISOLATION_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_REQUIREDPROPAGATION_SUPPORTSPROPAGATION_MANDATORYPROPAGATION_REQUIRES_NEWPROPAGATION_NOT_SUPPORTEDPROPAGATION_NEVERPROPAGATION_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 方法中出现 SQLExceptionMyCustomException 异常,事务会回滚。

总的来说,@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 是一个分布式事务管理器,可以用于管理跨多个数据库或系统的事务。它提供了可靠的事务管理和故障恢复机制。

这些技术和工具可以根据具体的项目需求和开发环境选择和组合使用,以实现有效的事务管理和数据库操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/764825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十三届蓝桥杯物联网试题(省赛)

做后感悟&#xff1a; OLED显示函数需要一直显示&#xff0c;所以在主函数中要一直循环&#xff0c;为了确保这个检错功能error只输出一次&#xff0c;最好用中断串口进行接收数据&#xff0c;数据收完后自动进入中断函数中&#xff0c;做一次数据检查就好了&#xff0c;该开灯…

单片机LED流水灯的演变过程

文章目录 前言一、代码的重要三部曲二、使用步骤1.引入库 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 课程需要&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、代码的重要三部曲 1.头文件 #include …

GEE:为什么在机器学习分类或回归时,提取特征变量后的样本点下载到本地时,数据为空且缺少坐标?

作者:CSDN @ _养乐多_ 在博客《GEE:随机森林分类教程(样本制作、特征添加、训练、精度、参数优化、贡献度、统计面积)》和《GEE:随机森林回归预测教程(样本点、特征添加、训练、精度、参数优化、贡献度)》中,详细记录了在 Google Earth Engine(GEE)平台上进行机器学…

银行数字人民币系统应用架构设计

2019年10月&#xff0c;01区块链联合数字资产研究院发布了《人民币3.0&#xff1a;中国央行数字货币运行框架与技术解析》&#xff0c;从数字货币界定和人民币发展历程出发&#xff0c;区分了央行数字货币与比特币、移动支付等的区别&#xff0c;全面介绍了央行数字货币的发展历…

Linux设备驱动开发 - 三色LED呼吸灯分析

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 展锐UIS7885呼吸灯介绍呼吸灯调试方法亮蓝灯亮红灯亮绿灯展锐UIS7885呼吸灯DTS配置ump9620 PMIC驱动ump9620中的LED呼吸灯驱动LED的tr…

代码+视频,R语言logistic回归交互项(交互作用)的可视化分析

交互作用效应(p for Interaction)在SCI文章中可以算是一个必杀技&#xff0c;几乎在高分的SCI中必出现&#xff0c;因为把人群分为亚组后再进行统计可以增强文章结果的可靠性&#xff0c;不仅如此&#xff0c;交互作用还可以使用来进行数据挖掘。在既往文章中&#xff0c;我们已…

MATLAB算法实战应用案例精讲-【数模应用】逐步回归(最终篇)(附Java、python、R语言和MATLAB代码实现)

目录 前言 知识储备 相关性检验 相关性系数 皮尔逊相关系数与皮尔曼相关系数<

【理解机器学习算法】之分类问题的模型评估(ROC-AUC)

ROC曲线&#xff08;接收者操作特性曲线&#xff09;和AUC&#xff08;曲线下面积&#xff09;是在不同阈值设置下&#xff0c;用于分类问题的性能度量工具。下面是它们所代表的含义以及使用方法&#xff1a; ROC曲线 代表含义&#xff1a;ROC曲线是一个图形化的表示&#xf…

掌握收支明细,轻松记录收支明细,一键打印财务自由

在繁忙的生活中&#xff0c;你是否曾感到对个人的财务状况一头雾水&#xff1f;是否曾在需要证明收支情况时手忙脚乱&#xff0c;翻箱倒柜地寻找凭证&#xff1f;今天&#xff0c;我要向你揭示一个简单而高效的方法&#xff0c;帮助你轻松记录收支明细&#xff0c;并一键打印&a…

Cesium 默认选中框设置

Cesium 默认提供的选中框 进来关注下不迷人&#xff0c;还有更多集合专栏&#xff01; 1、设置状态&#xff1a; 设置false 就不会出现这个默认的状态&#xff0c;如果需要修改如下&#xff1a; viewer._selectedEntitynewEntity newEntity 就是你需要设置选中框的样式 可以…

BGP4+简介

定义 BGP是一种用于自治系统AS&#xff08;Autonomous System&#xff09;之间的动态路由协议&#xff0c;常用版本是BGP-4&#xff0c;BGP-4只能传递IPv4路由。针对IPv6的BGP4扩展&#xff0c;通常称为BGP4。 目的 BGP4用于在AS之间传递路由信息&#xff0c;并不是所有情况…

python - 更改pdf中文本的字体高亮颜色(fitz模块)

import fitzdoc fitz.open(r"e:/test.pdf") pagedoc[0]# 按照指定的位置设置颜色 highlight page.add_highlight_annot((20, 500,60, 520)) highlight.set_colors(stroke[1, 1, 0]) # light red color (r, g, b) 颜色rgb每个除以255得出 highlight.update()# 按照…

YZ系列工具之YZ09: VBA_Excel之读心术

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套一部VBA手册&#xff0c;教程分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的…

大数据分析-基于Python的电影票房信息数据的爬取及分析

概要 现如今&#xff0c;人民群众对物质生活水平的要求已不再局限于衣食住行&#xff0c;对于精神文化有了更多的需求。电影在我国越来越受欢迎&#xff0c;电影业的发展越来越迅猛&#xff0c;为了充分利用互联网技术的发展&#xff0c;掌握电影业的态势&#xff0c;对信息进行…

Hive正则表达式使用

当在Hive中使用正则表达式时,可以使用三个函数来执行不同的操作: 1. regexp regexp函数用于测试一个字符串是否匹配给定的正则表达式。它的语法如下: regexp(string source, string pattern)source: 要测试的源字符串。pattern: 要匹配的正则表达式模式。如果源字符串与指…

网络工程师之网络安全篇

网络工程师之网络安全篇 1. 源MAC对应的端口改变时才会覆盖 同一个端口对应多个mac地址表项 接口&#xff1a;将一个交换机变为hub 2.IP欺骗&#xff1a; 1.首先使被信任主机的网络暂时瘫痪&#xff0c;以免对攻击造成干扰&#xff1b; 2.然后连接到目标机的某个端口来猜测序…

uniapp 写安卓app,运行到手机端 调试

手机 设置》关于手机》点击版本号 4-5次&#xff0c;弹出手机锁屏页面&#xff0c;输入手机锁屏密码 2.手机 设置中 》搜索 开发人员选项 》 调试》打开USB调试 同页面 找到 选择USB配置》选择 MIDIhbuilder 编辑器 点击 》运行》运行到手机或模拟器》运行到Android App基座 》…

打卡--MySQL8.0 三 (SQL语言)

SQL语言介绍 SQL 是 Structured Query Language&#xff08;结构化查询语言&#xff09;的缩写。 SQL 是用来与关系数据库进行通信的。 它是关系数据库管理系统的标准语言。 SQL 语句用于执行任务&#xff0c;如更新数据库中的数据&#xff0c;或从数据库中检索数据。 一些常见…

【滑动窗口】长度最小的子数组|无重复字符的最长子串|最大连续1的个数 III|将 x 减到 0 的最小操作数

1. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 1.题目解析&#xff1a; 2.算法原理 &#xff08;1&#xff09;方法一&#xff1a;暴力列举出所有的子数组的和 时间复杂度&#xff1a;O&#xff08;n**2&#xff09;&#xff1a;枚举所有子数组O&#xff08;…

在Windows中安装wsl2和ubuntu22.04

目录 一、概述二、安装wsl22.1 虚拟化设置2.2 虚拟化设置2.3 切换和更新wsl2 三、安装ubuntu3.1 下载Ubuntu22.043.2 配置Ubuntu22.04 一、概述 wsl2是一种面向Windows操作系统的虚拟化技术&#xff0c;可以让我们在Windows操作系统中“丝滑”的运行Linux系统。wsl2由微软团队…