JTA事务
JTA(Java Transaction API)为 J2EE 平台提供了分布式事务服务,它隔离了事务与底层的资源,实现了透明的事务管理方式
一个简单的使用jta的例子
简单来讲在JTA中有三类接口的定义:UserTransaction, Transaction, TransactionManager
TransactionManager:负责进行分布式事务对象的创建(对应于事务开始),当客户对事务有提交或撤销的请求时,代理到事务对象的调用上
UserTransaction:客户端的事务操作,用该接口的实现进行事务的开启,提交及撤销
Transaction:事务对象,当客户端进行事务开启时,TransactionManager实例化对应的Transaction事务对象并绑定到当前线程ThreadLocal,当客户端进行提交或撤销时,TransactionManager调用Transaction事务对象上相应的方法来实现分布式的两段式提交
在上面的例子可以看到,获取到的数据库连接并没有显性地与UserTransaction或TransactionManager进行绑定,但JTA依然实现了对其控制,这是有条件的,在分布式事务中,数据库连接或连接串必须实现XA协议,如XAConnection及XADataSource,实现了XA协议的数据库连接需要增加许多普通连接没有的功能,首先该连接是不支持自动提交的,然后在该连接中执行SQL语句的时候会调用TransactionManager实现检测当前线程的Transaction事务对象并将连接挂靠到其上,最后在提交的时候是支持先准备来再提交这种两段式提交而不是普通连接的直接提交方式,当客户端使用UserTransaction实现进行提交或撤销时,操作由TransactionManager转交给当前线程的Transaction事务对象,而事务对象则会对所有挂靠与其之上的所有连接XAConnection对象进行两段式提交操作
具体内容参考:
JTA 深度历险 - 原理与实现 http://www.ibm.com/developerworks/cn/java/j-lo-jta/index.html
使用 WS-AtomicTransaction 和 JTA 的分布式事务 http://www.ibm.com/developerworks/cn/webservices/ws-transjta/
使用 JTA 处理 DB2 UDB 和 Informix Dynamic Server 中的分布式事务 http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0505weber/
高级 DAO 编程 http://www.ibm.com/developerworks/cn/java/j-dao/
JTA(Java Transaction API)为 J2EE 平台提供了分布式事务服务,它隔离了事务与底层的资源,实现了透明的事务管理方式
一个简单的使用jta的例子
public void transferAccount() {
UserTransaction userTx = null;
Connection connA = null;
Statement stmtA = null;
Connection connB = null;
Statement stmtB = null;
try{
// 获得 Transaction 管理对象
userTx = (UserTransaction)getContext().lookup("\java:comp/UserTransaction");
// 从数据库 A 中取得数据库连接
connA = getDataSourceA().getConnection();
// 从数据库 B 中取得数据库连接
connB = getDataSourceB().getConnection();
// 启动事务
userTx.begin();
// 将 A 账户中的金额减少 500
stmtA = connA.createStatement();
stmtA.execute("update t_account set amount = amount - 500 where account_id = 'A'");
// 将 B 账户中的金额增加 500
stmtB = connB.createStatement();
stmtB.execute("\update t_account set amount = amount + 500 where account_id = 'B'");
// 提交事务
userTx.commit();
// 事务提交:转账的两步操作同时成功(数据库 A 和数据库 B 中的数据被同时更新)
} catch(SQLException sqle){
try{
// 发生异常,回滚在本事务中的操纵
userTx.rollback();
// 事务回滚:转账的两步操作完全撤销
//( 数据库 A 和数据库 B 中的数据更新被同时撤销)
stmt.close();
conn.close();
...
}catch(Exception ignore){
}
sqle.printStackTrace();
} catch(Exception ne){
e.printStackTrace();
}
}
简单来讲在JTA中有三类接口的定义:UserTransaction, Transaction, TransactionManager
TransactionManager:负责进行分布式事务对象的创建(对应于事务开始),当客户对事务有提交或撤销的请求时,代理到事务对象的调用上
UserTransaction:客户端的事务操作,用该接口的实现进行事务的开启,提交及撤销
Transaction:事务对象,当客户端进行事务开启时,TransactionManager实例化对应的Transaction事务对象并绑定到当前线程ThreadLocal,当客户端进行提交或撤销时,TransactionManager调用Transaction事务对象上相应的方法来实现分布式的两段式提交
在上面的例子可以看到,获取到的数据库连接并没有显性地与UserTransaction或TransactionManager进行绑定,但JTA依然实现了对其控制,这是有条件的,在分布式事务中,数据库连接或连接串必须实现XA协议,如XAConnection及XADataSource,实现了XA协议的数据库连接需要增加许多普通连接没有的功能,首先该连接是不支持自动提交的,然后在该连接中执行SQL语句的时候会调用TransactionManager实现检测当前线程的Transaction事务对象并将连接挂靠到其上,最后在提交的时候是支持先准备来再提交这种两段式提交而不是普通连接的直接提交方式,当客户端使用UserTransaction实现进行提交或撤销时,操作由TransactionManager转交给当前线程的Transaction事务对象,而事务对象则会对所有挂靠与其之上的所有连接XAConnection对象进行两段式提交操作
具体内容参考:
JTA 深度历险 - 原理与实现 http://www.ibm.com/developerworks/cn/java/j-lo-jta/index.html
使用 WS-AtomicTransaction 和 JTA 的分布式事务 http://www.ibm.com/developerworks/cn/webservices/ws-transjta/
使用 JTA 处理 DB2 UDB 和 Informix Dynamic Server 中的分布式事务 http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0505weber/
高级 DAO 编程 http://www.ibm.com/developerworks/cn/java/j-dao/