大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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账号...