JTA知识
JTA,即Java Transaction API,译为Java事务API。
JTA允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据。
JDBC驱动程序的JTA支持极大地增强了数据访问能力。
Java事务API(JTA:Java Transaction API)和它的同胞Java事务服务(JTS:Java Transaction Service),为J2EE平台提供了分布式事务服务(distributed transaction)。
一个分布式事务(distributed transaction)包括一个事务管理器(transaction manager)和一个或多个资源管理器(resource manager)。
一个资源管理器(resource manager)是任意类型的持久化数据存储。
事务管理器(transaction manager)承担着所有事务参与单元者的相互通讯的责任。
下列任一个Java平台的组件都可以参与到一个JTA事务中:
JDBC连接、
JDO PersistenceManager 对象、
JMS 队列、
JMS 主题、
企业JavaBeans(EJB)、
一个用J2EE Connector Architecture 规范编译的资源分配器。
实现分布式事务的关键事两阶段提交协议。
在此协议中,一个或多个资源管理器的活动均由一个称为事务协调器的单独软件组件来控制。
两阶段提交中第一阶段,事务协调器联络事务中涉及的每个资源管理器确保它们都能正确提交事务。
在第二阶段,事务协调器发出提交事务命令,资源管理器分别执行。
在第一阶段得到所有资源管理器肯定答复后第二阶段才会开始,从而实现数据的一致性提交。
包含分布式事务的典型环境中资源管理器(如数据库服务器)一般称作XA Resource。
基本代码样例如下:
XADataSource xaDS = null;
XAConnection xaCon = null;
XAResource xaRes = null;
Connection con = null;
Statement stmt = null;
Xid xid = null;
xaDS = new com.merant.datadirect.jdbcx.sqlserver.SQLServerDataSource();
xaDS.setDataSourceName("SQLServer");
xaDS.setServerName("server");
xaDS.setPortNumber(1433);
xaDS.setSelectMethod("cursor");
xaCon = xaDS.getXAConnection("jdbc_user", "jdbc_password");
xaRes = xaCon.getXAResource();
con = xaCon.getConnection();
stmt = con.createStatement();
xid = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});
try {
xaRes.start(xid, XAResource.TMNOFLAGS);
stmt.executeUpdate("insert into test_table values (100)");
xaRes.end(xid, XAResource.TMSUCCESS);
ret = xaRes.prepare(xid);
if (ret == XAResource.XA_OK) {
xaRes.commit(xid, false);
}
}
catch (XAException e) {
e.printStackTrace();
}
finally {
stmt.close();
con.close();
xaCon.close();
}
完整样例代码参考:
http://www.bianceng.cn/database/extra/201002/15180.htm
http://hi.baidu.com/lipengbin/blog/item/eb4bb5771423820fb151b968.html
JTA在应用服务器中的使用:
1、JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器)
http://www.cnblogs.com/huangjingzhou/articles/2012014.html
2、在Spring中使用JTA事务管理
http://java.e800.com.cn/articles/2007/417/1176746498587392322_1.html