建设集团网站的作用,网站建设公司权威排名,php做的网站有,金华电子商务网站建设事务的ACID属性#xff1a;原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation)和持久性(Durabilily) ACID 特性 A#xff08;原子性#xff09;事务的原子操作单元#xff0c;对数据的修改#xff0c;要么全部执行#xff0c;要么全部不执行#x…事务的ACID属性原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation)和持久性(Durabilily) ACID 特性 A原子性事务的原子操作单元对数据的修改要么全部执行要么全部不执行 C一致性在事务开始和完成时数据必须保持一致状态相关的数据规则必须应用于事务的修改以保证数据的完整性事务结束时所有的内部数据结构必须正确 I隔离性保证事务不受外部并发操作影响的独立环境执行 D持久性事务完成之后对于数据的修改是永久的即使系统出现故障也能够保持
一、Java事务管理
Java事务管理有三种类型 JDBC事务、JTAJava 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事务APIJava 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
三分布式事务管理
待完成