Java事务管理[通俗易懂]

Java事务管理[通俗易懂]事务的ACID属性:原子性(Atomicity)、一致性(Consistency)、隔离性或独立性(Isolation)和持久性(Durabilily)一、Java事务管理Java事务管理有三种类型:JDBC事务、JTA(JavaTransactionAPI)事务、容器事务1.1JDBC事务JDBC的一切行为包括事务是基于一个Connection的,JDBC通过Connec…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

事务的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 账户中的金额减少 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)

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 传统事务管理的弊端

// 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

三:分布式事务管理

待完成

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • goland 2021激活码_最新在线免费激活[通俗易懂]

    (goland 2021激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.htmlS32PGH0SQB-eyJsaWNlbnNlSWQi…

  • stm32使用oled显示屏_stm32f103c8t6封装

    stm32使用oled显示屏_stm32f103c8t6封装stm32f103c8t6控制OLED显示屏0.96寸4针OLED显示屏IIC蓝色0.96寸OLED显示屏7针SPI蓝色,6针黄蓝双色0.96寸4针OLED显示屏IIC蓝色话不多说,直接先上图!显然可以看出,利用IIC接口显示出来的文字是没那么清晰的,有点断断续续的。而这款显示屏我是买淘宝上这家店的,下面附上这个显示屏链接:0.96寸4针OLED显示屏IIC蓝色附上显示屏与stm32的接线://功能描述:OLEDI2C接口演示例程(STM32F103系列)//

    2022年10月15日
  • 系统数据库的概念结构,逻辑结构,物理结构设计方法_数据库的物理独立性是指

    系统数据库的概念结构,逻辑结构,物理结构设计方法_数据库的物理独立性是指由于自己在写这一部分的报告时,总感觉不能很好地理解概念含义,具体的设计目标也不知道用怎样的形式来表达。在做完相关报告之后,想着把老师指导之后改正的作业展示一下,希望可以给有类似问题的小伙伴一点点帮助。系统的概念数据库设计将需求分析得到的用户需求抽象为信息结构(即概念模型)的过程就是概念结构设计,最后生成的模型是E-R图。注:1、先写局部E-R图,再写整体的E-R图2、若所设计系统的实体、属性与联系很多,绘制出来的总E-R图过于复杂、不清晰,可以将整体的E-R图分解成实体-属性图和实体-联系图。其

    2022年10月11日
  • 路由器 转接_路由器网络接口

    路由器 转接_路由器网络接口路由器所在的网络位置比较复杂,既可是内部子网边缘,也可位于内、外部网络边缘。同时为了实现强大的适用性,它需要连接各种网络,这样,它的接口也就必须多种多样。对于这些,不要说一般的网络爱好者,就连许多网管人员都无法说清楚。为此笔者向大家全面介绍路由器的各种接口及连接方法。一、路由器接口路由器具有非常强大的网络连接和路由功能,它可以与各种各样的不同网络进行物理连接,这就决定了路由器的接口技术非常复杂,越是高档的路由器其接口种类也就越多,因为它所能连接的网络类型越多。路由器的端口主要分局域网端口、广

    2022年10月19日
  • datagrip2021.4.2激活码_通用破解码

    datagrip2021.4.2激活码_通用破解码,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • android gridlayout点击事件,Android GridLayout

    android gridlayout点击事件,Android GridLayout译者注:说实话我确实没用过GridLayout好好认识一下吧!android开发者每天都在问自己一个问题:我到底应该用哪个layout然而GridLayout在当前开发中的情况如下:大多数开发者并不知道这个布局一些开发者知道GridLayout但是因为某些原因没有使用只有少部分开发者花时间了解和积极使用这是我为什么要写这篇文章的原因,因为我觉得这个布局被不公平遗忘了为什么我们需要GridLa…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号