`

JTA Transactions

 
阅读更多

JTA : Java Transaction API

界定事务的方式与事务管理器的实现无关

允许分布式事务处理。

JTA transaction允许访问多个数据库,通常的DBMS transaction是不允许的。

JTA transaction不允许nested transaction。

 

JTS : Java Transaction Service

GlassFish提供了包含JTS的事务管理器实现。但用户不会直接调用JTS,而是调用JTA,由JTA来调用更低层的JTS。

 

distributed transaction 包含:

一个transaction manager 

事务管理器: 管理所有事务参与者之间的通信。

一个或多个resource manager 

资源管理器: 持久化数据存储。

 

JTA与JDBC

JTA事务可以有多个参与者,参与者可以是 : JDBC连接、JDO PersistenceManager对象、JMS队列、JMS主题、EJB、J2EE Connector Architecture规范的资源分配器。

JDBC事务只能有一个参与者 : 一个JDBC连接,不能多个数据库。

两种模式:自动提交(default)、手动提交。

 

javax.transaction.UserTransaction

JTA来处理事务用到的Java类


 

更新多个数据库

JavaEE容器会管理所有的EJB事务,除了Bean-Managed JDBC事务。?

JavaEE事务管理器允许在同一个事务中,更新多个数据库。

(1) 在同一个JavaEE容器中


其中,Bean-A负责begin,end,所有X、Y、Z的操作在同一个事务中。

(2)在不同的JavaEE容器中


也是在同一个事务中,由JavaEE事务管理器们保证这一点。

 

JDBC事务示例代码:

 

  1. package test.xue.transaction;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.SQLException;  
  6. import java.sql.Statement;  
  7.   
  8. /** 
  9.  * database : transaction 
  10.  * table : message(title) 
  11.  * table : balance(user, balance) 
  12.  */  
  13. public class JDBCTransaction {  
  14.     public static Connection getConnection() throws Throwable {  
  15.         Class.forName("com.mysql.jdbc.Driver");  
  16.         Connection conn = DriverManager.getConnection(  
  17.                 "jdbc:mysql://127.0.0.1:3306/transaction""root""root");  
  18.   
  19.         return conn;  
  20.     }  
  21.   
  22.     public void autoCommit() throws Throwable {  
  23.         Connection conn = JDBCTransaction.getConnection();  
  24.   
  25.         Statement stmt = conn.createStatement();  
  26.   
  27.         // default autoCommit   
  28.         stmt.executeUpdate("insert into message values('hello world')");  
  29.   
  30.         conn.close();  
  31.     }  
  32.   
  33.     public void noAutoCommit() throws Throwable {  
  34.         Connection conn = JDBCTransaction.getConnection();  
  35.         conn.setAutoCommit(false);  
  36.   
  37.         String user1 = "Lily", user2 = "Lucy";  
  38.         int count = 123;  
  39.         Statement stmt = conn.createStatement();  
  40.         try {  
  41.             // begin a transaction   
  42.             int updated = stmt  
  43.                     .executeUpdate("update balance set balance=balance-"  
  44.                             + count + " where user='" + user1 + "'");  
  45.             if (updated == 0) {  
  46.                 throw new SQLException(user1 + " not exists");  
  47.             }  
  48.             updated = stmt.executeUpdate("update balance set balance=balance+"  
  49.                     + count + " where user='" + user2 + "'");  
  50.             if (updated == 0) {  
  51.                 throw new SQLException(user1 + " not exists");  
  52.             }  
  53.   
  54.             conn.commit();  
  55.             // end the transaction   
  56.         } catch (Throwable e) {  
  57.             // when exception occurs, rollback all   
  58.             conn.rollback();  
  59.             e.printStackTrace();  
  60.         }  
  61.   
  62.         conn.close();  
  63.     }  
  64.   
  65.     public static void main(String[] args) throws Throwable {  
  66.         JDBCTransaction jdbc = new JDBCTransaction();  
  67.         jdbc.autoCommit();  
  68.         jdbc.noAutoCommit();  
  69.     }  
  70. }  
package test.xue.transaction;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * database : transaction
 * table : message(title)
 * table : balance(user, balance)
 */
public class JDBCTransaction {
	public static Connection getConnection() throws Throwable {
		Class.forName("com.mysql.jdbc.Driver");
		Connection conn = DriverManager.getConnection(
				"jdbc:mysql://127.0.0.1:3306/transaction", "root", "root");

		return conn;
	}

	public void autoCommit() throws Throwable {
		Connection conn = JDBCTransaction.getConnection();

		Statement stmt = conn.createStatement();

		// default autoCommit
		stmt.executeUpdate("insert into message values('hello world')");

		conn.close();
	}

	public void noAutoCommit() throws Throwable {
		Connection conn = JDBCTransaction.getConnection();
		conn.setAutoCommit(false);

		String user1 = "Lily", user2 = "Lucy";
		int count = 123;
		Statement stmt = conn.createStatement();
		try {
			// begin a transaction
			int updated = stmt
					.executeUpdate("update balance set balance=balance-"
							+ count + " where user='" + user1 + "'");
			if (updated == 0) {
				throw new SQLException(user1 + " not exists");
			}
			updated = stmt.executeUpdate("update balance set balance=balance+"
					+ count + " where user='" + user2 + "'");
			if (updated == 0) {
				throw new SQLException(user1 + " not exists");
			}

			conn.commit();
			// end the transaction
		} catch (Throwable e) {
			// when exception occurs, rollback all
			conn.rollback();
			e.printStackTrace();
		}

		conn.close();
	}

	public static void main(String[] args) throws Throwable {
		JDBCTransaction jdbc = new JDBCTransaction();
		jdbc.autoCommit();
		jdbc.noAutoCommit();
	}
}


JTA事务:

 

JDBC驱动: javax.sql. XADataSource, XAConnection, XAResource

XAConnection与Connection的区别为: XAConnection可以用在JTA事务中,且不支持自动提交。

 

  1. package test.xue.transaction;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.SQLException;  
  5. import java.sql.Statement;  
  6.   
  7. import javax.sql.XAConnection;  
  8. import javax.sql.XADataSource;  
  9. import javax.transaction.xa.XAException;  
  10. import javax.transaction.xa.XAResource;  
  11.   
  12. import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;  
  13. import com.mysql.jdbc.jdbc2.optional.MysqlXid;  
  14.   
  15. public class JTATransaction {  
  16.     public XADataSource getDataSource() {  
  17.         MysqlXADataSource ds = new MysqlXADataSource();  
  18.         ds.setServerName("localhost");  
  19.         ds.setPortNumber(3306);  
  20.         ds.setDatabaseName("transaction");  
  21.   
  22.         return ds;  
  23.     }  
  24.   
  25.     public void testJTA() throws SQLException, XAException {  
  26.         XADataSource ds = getDataSource();  
  27.         XAConnection xaconn = ds.getXAConnection("root""root");  
  28.         Connection conn = xaconn.getConnection();  
  29.         Statement stmt = conn.createStatement();  
  30.   
  31.         XAResource res = xaconn.getXAResource(); // for mysql-connector-java-5.1.21-bin.jar, return xaconn itself   
  32.         MysqlXid xid = new MysqlXid(new byte[] { 11 }, new byte[] { 22 }, 99);  
  33.         res.start(xid, XAResource.TMNOFLAGS);  
  34.         stmt.executeUpdate("insert into message values('hello JTA')");  
  35.         res.end(xid, XAResource.TMSUCCESS);  
  36.         int ret = res.prepare(xid);  
  37.         if (ret == XAResource.XA_OK) {  
  38.             res.commit(xid, false);  
  39.         }  
  40.   
  41.         stmt.close();  
  42.         conn.close();  
  43.         xaconn.close();  
  44.     }  
  45.   
  46.     public static void main(String[] args) throws SQLException, XAException {  
  47.         JTATransaction jta = new JTATransaction();  
  48.         jta.testJTA();  
  49.     }  
  50. }  
package test.xue.transaction;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.XAConnection;
import javax.sql.XADataSource;
import javax.transaction.xa.XAException;
import javax.transaction.xa.XAResource;

import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;
import com.mysql.jdbc.jdbc2.optional.MysqlXid;

public class JTATransaction {
	public XADataSource getDataSource() {
		MysqlXADataSource ds = new MysqlXADataSource();
		ds.setServerName("localhost");
		ds.setPortNumber(3306);
		ds.setDatabaseName("transaction");

		return ds;
	}

	public void testJTA() throws SQLException, XAException {
		XADataSource ds = getDataSource();
		XAConnection xaconn = ds.getXAConnection("root", "root");
		Connection conn = xaconn.getConnection();
		Statement stmt = conn.createStatement();

		XAResource res = xaconn.getXAResource(); // for mysql-connector-java-5.1.21-bin.jar, return xaconn itself
		MysqlXid xid = new MysqlXid(new byte[] { 11 }, new byte[] { 22 }, 99);
		res.start(xid, XAResource.TMNOFLAGS);
		stmt.executeUpdate("insert into message values('hello JTA')");
		res.end(xid, XAResource.TMSUCCESS);
		int ret = res.prepare(xid);
		if (ret == XAResource.XA_OK) {
			res.commit(xid, false);
		}

		stmt.close();
		conn.close();
		xaconn.close();
	}

	public static void main(String[] args) throws SQLException, XAException {
		JTATransaction jta = new JTATransaction();
		jta.testJTA();
	}
}


其中,Xid的两个参数分别为:全局事务Id,分支事务Id。

 

此例子中没有用到事务管理器与资源管理器,也没有用到分布式事务和多个数据库,只是最简单的介绍JTA事务。

关于两阶段提交协议,以后再说吧。

分享到:
评论

相关推荐

    atomikos-transactions-jta.jar.zip

    Atomikos Transactions JTA 是一个开源的企业级事务处理解决方案,主要针对Java应用程序,尤其是那些运行在Java EE(Enterprise Edition)环境中的应用。JTA(Java Transaction API)是Java平台的标准接口,用于处理...

    quartz-1.4.5.zip

    Quartz is a richly featured, open source job scheduling library that can be ... The Quartz Scheduler includes many enterprise-class features, such as support for JTA transactions and clustering.

    quartz 1.8 & 2.2

    Quartz is a richly featured, open source job scheduling library that can be ... The Quartz Scheduler includes many enterprise-class features, such as support for JTA transactions and clustering.

    Quartz Scheduler Framework 2.0.chm

    Quartz is a full-featured, open source job scheduling service that can be integrated with, or ... The Quartz Scheduler includes many enterprise-class features, such as JTA transactions and clustering.

    Quartz-2.1.x-Documentation

    Quartz is a full-featured, open source job scheduling service that can be integrated with, or used along side virtually any Java EE ...enterprise-class features, such as JTA transactions and clustering.

    Pivotal Certified Spring Enterprise Integration Specialist Exam(Apress,2015)

    Exam topics covered include tasks and scheduling, remoting, the Spring Web Services framework, RESTful services with Spring MVC, the Spring JMS module, JMS and JTA transactions with Spring, batch ...

    第二部分spring+hibernate+jta 分布式事务Demo

    在项目中引入`transactions-jta.jar`、`transactions.jar`、`atomikos-util.jar`等Atomikos相关的库,意味着我们将利用其强大的事务管理功能。 1. **Spring与JTA的整合**: Spring通过`PlatformTransactionManager...

    atomikos-transactions-jta.jar

    官方版本,亲测可用

    transactions-jta-4.0.6.jar

    jta.jar 各个版本,免费下载 transactions-jta.jar 各个版本,免费下载 ow2-jta-1.1-spec.jar 各个版本,免费下载 JTA规范,当 Hibernate 使用 JTA 的时候需要,不过 App Server 都会带上

    transactions-jta-3.2.3.jar

    jta.jar 各个版本,免费下载 transactions-jta.jar 各个版本,免费下载 ow2-jta-1.1-spec.jar 各个版本,免费下载 JTA规范,当 Hibernate 使用 JTA 的时候需要,不过 App Server 都会带上

    transactions-jta-5.0.6.jar

    jta.jar 各个版本,免费下载 transactions-jta.jar 各个版本,免费下载 ow2-jta-1.1-spec.jar 各个版本,免费下载 JTA规范,当 Hibernate 使用 JTA 的时候需要,不过 App Server 都会带上

    transactions-jta-3.6.4.jar

    jta.jar 各个版本,免费下载 transactions-jta.jar 各个版本,免费下载 ow2-jta-1.1-spec.jar 各个版本,免费下载 JTA规范,当 Hibernate 使用 JTA 的时候需要,不过 App Server 都会带上

    transactions-jta-5.0.3.jar

    jta.jar 各个版本,免费下载 transactions-jta.jar 各个版本,免费下载 ow2-jta-1.1-spec.jar 各个版本,免费下载 JTA规范,当 Hibernate 使用 JTA 的时候需要,不过 App Server 都会带上

    transactions-jta-5.0.9.jar

    jta.jar 各个版本,免费下载 transactions-jta.jar 各个版本,免费下载 ow2-jta-1.1-spec.jar 各个版本,免费下载 JTA规范,当 Hibernate 使用 JTA 的时候需要,不过 App Server 都会带上

    transactions-jta-3.8.0.jar

    jta.jar 各个版本,免费下载 transactions-jta.jar 各个版本,免费下载 ow2-jta-1.1-spec.jar 各个版本,免费下载 JTA规范,当 Hibernate 使用 JTA 的时候需要,不过 App Server 都会带上

    transactions-jta-3.7.1.jar

    jta.jar 各个版本,免费下载 transactions-jta.jar 各个版本,免费下载 ow2-jta-1.1-spec.jar 各个版本,免费下载 JTA规范,当 Hibernate 使用 JTA 的时候需要,不过 App Server 都会带上

    transactions-jta-3.9.3.jar

    jta.jar 各个版本,免费下载 transactions-jta.jar 各个版本,免费下载 ow2-jta-1.1-spec.jar 各个版本,免费下载 JTA规范,当 Hibernate 使用 JTA 的时候需要,不过 App Server 都会带上

    transactions-jta-4.0.3.jar

    jta.jar 各个版本,免费下载 transactions-jta.jar 各个版本,免费下载 ow2-jta-1.1-spec.jar 各个版本,免费下载 JTA规范,当 Hibernate 使用 JTA 的时候需要,不过 App Server 都会带上

    jta.jar包;jta.jar包

    4. **XA Transactions**: JTA使用X/Open XA协议来支持两阶段提交(2PC)过程,确保跨多个资源的事务一致性。`XAResource`接口是实现这一协议的关键。 5. **TransactionSynchronizationRegistry**: 提供了在事务上...

    jta1.1-doc

    - **补偿事务( Compensation-based Transactions)**:通过定义回滚操作(补偿操作),JTA 1.1支持在事务失败时进行回滚恢复。 - **JTA与JPA/EJB集成**:在Java EE环境中,JTA与JPA(Java Persistence API)和EJB...

Global site tag (gtag.js) - Google Analytics