Java事务管理

article/2025/10/3 3:25:09

事务的ACID属性:原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation)和持久性(Durabilily)
ACID 特性

  • A(原子性)事务的原子操作单元,对数据的修改,要么全部执行,要么全部不执行;

  • C(一致性)在事务开始和完成时,数据必须保持一致状态,相关的数据规则必须应用于事务的修改,以保证数据的完整性,事务结束时,所有的内部数据结构必须正确;

  • I(隔离性)保证事务不受外部并发操作影响的独立环境执行;

  • D(持久性)事务完成之后,对于数据的修改是永久的,即使系统出现故障也能够保持;

一、Java事务管理

Java事务管理有三种类型:
JDBC事务、JTA(Java Transaction API)事务、容器事务

1.1 JDBC事务

JDBC的一切行为包括事务是基于一个Connection的,JDBC通过Connection对象进行事务管理。常用的事物相关方法是:setAutoCommit\commit\rollback等
在这里插入图片描述

下面是一个简单的JDBC事务方法:

public void JdbcTransfer() {java.sql.Connection conn = null;Statement stmt = null;try {conn = conn = DriverManager.getConnection("jdbc:oracle:thin:@host:1521:SID", "username", "userpwd");// 将自动提交设置为 false,// 若设置为 true 则数据库将会把每一次数据更新认定为一个事务并自动提交conn.setAutoCommit(false);stmt = conn.createStatement();// 将 A 账户中的金额减少 500stmt.execute("update t_account set amount = amount - 500 where account_id = 'A'");// 将 B 账户中的金额增加 500stmt.execute("update t_account set amount = amount + 500 where account_id = 'B'");// 提交事务conn.commit();// 事务提交:转账的两步操作同时成功} catch (SQLException e) {try {// 发生异常,回滚在本事务中的操做conn.rollback();// 事务回滚:转账的两步操作完全撤销stmt.close();conn.close();} catch (Exception ignore) {}e.printStackTrace();}
}

JDBC事务的优点:
接口较为简单,性能较好
缺点:
不支持多数据库的事务

1.2 JTA事务

Java事务API(Java Transaction API,简称JTA)
Java事务服务(Java Transaction Service,简称JTS)
在这里插入图片描述

JTA和JTS一起,为J2EE平台提供了分布式事务服务。JTA只提供接口,没有具体的实现,需要J2EE服务提供商根据JTS规范提供,常见的JTA实现方式:

  • J2EE容器提供的JTA实现(如JBOSS)
  • 独立的JTA实现:如JOTM、Atomikos。这些实现可以应用在哪些不适用J2EE应用服务器的环境里以提供分布式事务保证。(如Tomcat、Jetty以及普通的java应用)

JTA提供了 java.transaction.UserTransaction,里面定义了下面的方法:

  • begin:开启一个事务
  • commit:提交一个事务
  • rollback:回滚一个事务
  • setRollBackOnly:把当前事务标记为回滚
  • setTransactionTimeout:设置事务的时间,超过这个时间,就抛出异常,回滚事务

另外,不是使用了UserTransaction就能把普通的JDBC操作直接转成JTA操作,JTA对DataSource、Connection与Resource都是有要求的,只有符合XA规范,并且实现了XA规范的相关接口的类才能参与到JTA事务中来。(PS:主流的数据库都支持XA规范)
想要使用JTA事务,就需要一个实现了javax.sql.XADataSource、javax.sql.XAConnection、javax.sql.XAResource接口的JDBC驱动程序。
XADataSource对象时XAConnection对象的工厂,XAConnection是参与JTA事务的JDBC连接
XA连接(javax.sql.XAConnection)和非XA连接(javax.sql.Connection)的区别在于:XA可以参与JTA事务,而且不支持自动提交

下面是一个依赖于J2EE容器的,使用JTA事务的转账操作(需要通过JNDI方式获取UserTransaction与DataSource)

public void JtaTransfer() {javax.transaction.UserTransaction tx = null;java.sql.Connection conn = null;Statement stmt = null;try {tx = (javax.transaction.UserTransaction) context.lookup("java:comp/UserTransaction"); // 取得JTA事务,本例中是由Jboss容器管理javax.sql.DataSource ds = (javax.sql.DataSource) context.lookup("java:/XAOracleDS"); // 取得数据库连接池,必须有支持XA的数据库、驱动程序tx.begin();conn = ds.getConnection();// 将自动提交设置为 false,// 若设置为 true 则数据库将会把每一次数据更新认定为一个事务并自动提交conn.setAutoCommit(false);stmt = conn.createStatement();// 将 A 账户中的金额减少 500stmt.execute("update t_account set amount = amount - 500 where account_id = 'A'");// 将 B 账户中的金额增加 500stmt.execute("update t_account set amount = amount + 500 where account_id = 'B'");// 提交事务tx.commit();// 事务提交:转账的两步操作同时成功} catch (SQLException sqle) {try {// 发生异常,回滚在本事务中的操做tx.rollback();// 事务回滚:转账的两步操作完全撤销stmt.close();conn.close();} catch (Exception ignore) {}sqle.printStackTrace();}
}

扩展:
标准的分布式事务(Distributed Transaction)
一个事务管理器(Transaction)

1.3 容器事务

容器事务主要是J2EE应用服务提提供的,容器事务大多基于JTA实现,是基于JNDI的,相当复杂的API实现
EJB实现了相关服务

二、Spring事务管理

2.1 传统事务管理的弊端

// JDBC事务 
Connection conn = getConnection(); 
conn.setAutoCommit(false);
... // 业务实现 ... 
if 正常 conn.commit(); 
if 失败 conn.rollback();
// Hibernate事务 
Session s = getSession(); 
Transaction tx = s.beginTransaction(); 
... // 业务实现 ... 
if 正常 tx.commit(); 
if 失败 tx.rollback();

传统的事务处理与业务代码耦合,导致后期维护以及在不同的事务之间切换的时候,开发者必须手动修改代码。Spring事务管理能够解决以上痛点。

在这里插入图片描述
在这里插入图片描述

Spring 事务管理深入解析参考:https://my.oschina.net/pingpangkuangmo/blog/415162

三:分布式事务管理

待完成


http://chatgpt.dhexx.cn/article/wiCKUGqS.shtml

相关文章

java 事务级别_java事务隔离级别

事务隔离级别是由数据库系统实现的。 Java事务 1) 说到事务,不得不提的就是ACID特性,再次回顾: 原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。 一致性(consistency)&#xff1a…

Java中使用事务(注解实现)

Java中使用事务(注解实现) 事务的介绍 描述: 对于一个功能实现或者业务流程,要么全做,要么全不做! 特性: ACID A - 原子性:执行的最小单位,要么全做,要么全…

JAVA的事务

要先知道什么是java中的事务? 事务: 一般是指要做的或所做的事情.专业术语是这样说的: 就是代码逻辑上的一组操作,这些操作要么全部成功,要么全部失败!举一个现实生活当中的例子: 1张三账上有2000元,李四账号也有2000元。张三要向李四转账1000元,正常来…

Java中的事务

一、事务概述 1. 什么是事务 事务是指对数据库的一系列的操作序列,数据库应用系统通过事务集来完成对数据的存取操作。 2. 事务的特性(ACID原则) 原子性(Atomicity):一个事务的操作不可分割&#xff0c…

java事务总述

文章目录 一、java事务概述1.1、java事务简述1.2、Java事务的类型1.3、java事务的特性1.4、java事务的隔离级别1.5、spring事务的传播特性1.6、spring支持的事务管理类型 二、java事物使用2.1、XML配置2.2、事务使用方式 一、java事务概述 1.1、java事务简述 1、简介 事务(TR…

Java中的事务及使用

什么是事务? 事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C或Java&am…

测试用例设计方法---等价类划分法

1 等价类划分法 1.1 定义 是把所有可能输入的数据,即程序的输入域划分策划国内若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。方法是一种重要的、常用的黑盒测试用例设计方法。 1.1划分等价类 1&a…

02测试用例设计方法-等价类划分

等价类划分法 1)定义 是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。该方法是一种重要的,常用的黑盒测试用例设计方法。使用这一方法时,完全不考虑程序的…

等价类划分用例案例设计

一、加法案例 测试要求:计算1到100的两个整数之和(包括1和100) 提示:一般是一个框输入正确的值,一个框输入错误的值,没有两个框都输入错误的值,因为更容易确定到底是哪个框出现错误的值&#x…

常见测试用例设计方法1---等价类划分

目录 一,等价类划分概念: 二,有效等价类和无效等价类: 三,划分等价类的标准 四,设计测试用例 五,以QQ密码设定规则为例使用等价类划分编写测试用例 1,分析需求,确定输…

黑盒测试方法|测试用例的设计方法--等价类划分方法

黑盒测试方法–测试用例的设计方法–等价类划分方法 目录 等价类划分方法边界值分析方法错误推测方法因果图方法判定表驱动分析方法正交实验设计方法功能图分析方法场景设计方法 等价类划分方法 一、方法简介 (1)定义 把所有可能的输入数据,即程序的…

软件测试:等价类划分举例

等价类的设计思路: 根据输入条件,确定等价类,包括有效等价类和无效等价类,建立等价类列表为每个等价类规定一个唯一的编号设计一个测试用例,使其尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步&#xff…

等价类划分法-案例剖析-设计测试用例

目录 等价类划分法概念 有效等价类和无效等价类 等价类设计测试用例步骤 案例1 案例2 案例3 等价类划分法概念 等价类划分法是把所有可能的输入数据,即程序的输入数据集合划分成若干个子集即等价类,然后从每个等价类中选取少量具有代表性的数据作为…

15.3-等价类划分

目录 一、等价类划分的概念 二、使用等价类划分的原因 三、等价类划分的价值 四、相关概念 1、等价类 2、有效等价类 3、无效等价类 五、等价类划分法使用步骤 六、等价类的划分原则 1、原则1 2、原则2 3、原则3 4、原则4 5、原则5 6、原则6 七、测试用例的设计步骤 八、等价类…

软件测试用例设计 (一)等价类划分法

软件测试对于软件的重要性不言而喻,是计算机类学生毕业后的一个重要从业方向之一。 如果要从事软件测试,那么有些必备的技能还是要有的。比如,测试理论、测试工具、测试文档的编制。 今天我们就来看看最最最重要的测试理论:黑盒…

测试用例设计——等价类划分法

一、分析问题 如果我们需要对下面的这个两位数加法器设计测试用例,在测试了1+1,1+2,(-1)1和(-1)+2之后,是否有必要测试1+3&#xff0c…

等价类划分法设计用例(超详细)

等价类划分法 等价类: 1、解决了不能穷举测试的问题、控制成本、控制测试用例数量 2、数据值要明确,对文字敏感 3、依据需求将输入划分为若干个等价类,划分等价类(需求、数据特征) 等价类设计用例的难点:…

测试用例设计方法 之【等价类划分法】

前言: 在没有测试用例之前,团队里的成员进行测试时,完全“以人为本”,根据个人思路、需求理解度、发散性思想来完成测试系统,人无完人,弊端显而易见。衍生出【测试用例】后,测试工作的目标得到…

等价类划分法测试用例设计举例

一、基本概念 等价类是指程序输入域的子集。 等价类划分(Equivalance Partitioning)测试的思想:将程序的输入域划分为若干个区域(等价类),并在每个等价类中选择一个具有代表性的元素生成测试用例。该方法…

等价类划分测试用例设计方法

一.方法简介 1.定义 是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。该方法是一种重要的,常用的黑盒测试用例设计方法。 2.划分等价类 等价类是指某个输入域的子集合。在该子集合…