前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java事务管理[通俗易懂]

Java事务管理[通俗易懂]

作者头像
全栈程序员站长
发布于 2022-11-07 06:56:35
发布于 2022-11-07 06:56:35
84201
代码可运行
举报
运行总次数:1
代码可运行

事务的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事务方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 账户中的金额减少 500
stmt.execute("update t_account set amount = amount - 500 where account_id = 'A'");
// 将 B 账户中的金额增加 500
stmt.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)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 账户中的金额减少 500
stmt.execute("update t_account set amount = amount - 500 where account_id = 'A'");
// 将 B 账户中的金额增加 500
stmt.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 传统事务管理的弊端

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// JDBC事务 
Connection conn = getConnection(); 
conn.setAutoCommit(false);
... // 业务实现 ... 
if 正常 
conn.commit(); 
if 失败 
conn.rollback();
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Hibernate事务 
Session s = getSession(); 
Transaction tx = s.beginTransaction(); 
... // 业务实现 ... 
if 正常 
tx.commit(); 
if 失败 
tx.rollback();

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

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

三:分布式事务管理

待完成

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/184268.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月9日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JTA深度历险-原理与实现
在 J2EE 应用中,事务是一个不可或缺的组件模型,它保证了用户操作的 ACID(即原子、一致、隔离、持久)属性。对于只操作单一数据源的应用,可以通过本地资源接口实现事务管理;对于跨数据源(例如多个数据库,或者数据库与 JMS)的大型应用,则必须使用全局事务 JTA (Java Transaction API)。JTA 为 J2EE 平台提供了分布式事务服务,它隔离了事务与底层的资源,实现了透明的事务管理方式。 #1 利用 JTA 处理事务# ##1.1 什么是事务处理## 事务是计算机应用中不可或缺的组件
用户1263954
2018/01/30
1.1K0
JTA深度历险-原理与实现
Spring 原理
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。其特点如下:
cherishspring
2019/11/20
2990
Java核心知识点整理大全14-笔记
事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性 ( Atomicity )、一致性 ( Consistency )、隔离性 ( Isolation ) 和持久性 ( Durabilily )。
用户10920956
2024/01/18
1610
Java核心知识点整理大全14-笔记
使用Atomikos实现JTA分布式事务
本文全面的介绍了JTA分布式事务模型和接口规范,以及开源的分布式事务解决方案Atomikos。笔者认同"talk is cheap,show me the code",因此在文章最后,给出一个完整的Atomikos与spring、mybatis整合的完整案例。
田守枝
2019/05/27
3.5K0
java事务的使用_Java跨库事务
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
全栈程序员站长
2022/11/07
1.8K0
java事务的使用_Java跨库事务
基于可靠消息方案的分布式事务(二):Java中的事务
前言:在上一篇文章 基于可靠消息方案的分布式事务:Lottor介绍 中介绍了常见的分布式事务的解决方案以及笔者基于可靠消息方案实现的分布式事务组件Lottor的原理,并展示了应用的控制台管理。在正式介绍Lottor的具体实现之前,本文首先将会介绍Java中的事务管理,重点介绍Spring的事务管理。PS:有很多读者提问Lottor是否开源,这里统一回答:是开源的,Lottor目前在笔者所在公司的内部项目应用,并且笔者在将耦合的业务代码重构,将会在下一篇文章同步更新到GitHub,敬请期待。本文较长,适合电脑
aoho求索
2018/06/04
1.2K0
Java Spring (Part1: Spring 基础知识框架)
Spring 是一个轻量级容器(Container), 只要由IOC 和 AOP组成; 又叫控制反转和面向切面
JiahuiZhu1998
2022/12/06
4770
深入Java事务的原理与应用
事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)的缩写。事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。一致性表示 当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。持 久性表示已提交的数据在事务执行失败时,数据的状态都应该正确。
全栈程序员站长
2022/07/15
3460
JTA规范
JTA规范下载地址:http://download.oracle.com/otn-pub/jcp/jta-1.1-spec-oth-JSpec/jta-1_1-spec.pdf
Java帮帮
2018/12/27
1.1K0
JTA规范
Java中事务总结详解
事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)的缩写。
DencyCheng
2020/03/11
4.1K0
分布式事务之Spring事务与JMS事务(二)
Spring事务机制主要包括声明式事务和编程式事务,声明式事务让我们从复杂的事务处理中得到解脱,编程式事务在实际开发中得不到广泛使用,仅供学习参考。
蒋老湿
2019/07/31
2K0
Java 中事务的应用
在企业级应用开发中,事务是确保数据完整性和一致性的关键机制。Java 提供了丰富的事务处理能力,通过合理地运用事务,可以有效地避免数据在并发操作或系统故障时出现不一致的情况。本文将深入探讨 Java 中事务的概念、原理、应用场景以及如何在不同的环境中使用事务来保障数据的正确性和可靠性。
编程小白狼
2024/12/31
1070
JDBC的事务管理
事务:一个事件的完成需要几个子操作的联合完成,只要有一个子操作执行失败,则数据回滚到原始状态,都成功则提交数据.
葆宁
2019/04/19
5780
JDBC事务控制管理
今天是学习计划的第二天,感觉自己的学习热情还是很高涨的啊,那我们就趁热打铁,开始今天的学习。 今天的学习内容是JDBC的事务控制管理。 首先是概念性的内容 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。这是我对于事务的理解。 举个例子: A转账给B,对应如下的两条sql语句 update from account set money = money - 100 where name = ‘A’ update from account set money = money + 100 where name = ‘B’ 在现实生活中,这两条sql语句要么就应该同时成功,要么就应该同时失败,否则用户的账户就会产生问题。 在MySQL数据库中,默认情况下,一条sql语句就是一个单独的事务,事务是自动提交的 在Oracle数据库中,默认情况下,事务不是自动提交的,所有sql语句都处于一个事务中,需要手动进行事务提交。 数据库事务命令
wangweijun
2020/02/13
1.2K0
atomikos JTA/XA全局事务
Atomikos公司官方网址为:https://www.atomikos.com/。
Java帮帮
2018/12/28
2.9K0
atomikos JTA/XA全局事务
分布式事务之数据库事务与JDBC事务实现(一)
介绍事务的四大原则,并通过实例介绍数据库实现事务的方法,以及使用JDBC实现事务的方法。
蒋老湿
2019/07/31
1K0
Java EE应用服务器的事务管理
在计算机科学中,事务处理(transaction processing )是将信息处理划分为独立的、不可分割的操作,称为事务(Transaction)。每个事务必须作为一个完整的执行单元,要么整个事务成功(提交),要么失败(中止,回滚),它永远不能只是部分完成。使用事务可以简化应用程序的错误处理,因为它不需要担心部分失败,系统(通常是数据库或某些现代文件系统)的完整性始终处于已知的、一致的状态。
mazhen
2023/11/24
4110
Java EE应用服务器的事务管理
JAVA保姆式上手教程之入门精通案例
<img src="assets/image-20211123160059187.png" alt="image-20211123160059187" style="zoom: 33%;" />
张哥编程
2024/12/13
1010
MySQL 中基于 XA 实现的分布式事务
Xa主要规定了RM与TM之间的交互,下面来看下XA规范中定义的RM 和 TM交互的接口:
凯哥Java
2022/12/16
1.9K1
MySQL 中基于 XA 实现的分布式事务
Java+Oracle实现事务——JDBC事务
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/46675171
DannyHoo
2018/09/13
1.6K0
相关推荐
JTA深度历险-原理与实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验