JTA提供的是分布式的事务管理,其事务管理由JTA容器实现,JTA容器对当前加入事务的众多Connection进行调度,满足其事务性要求。
JTA的事务周期可以横跨多个JDBCConnection生命周期。因此,JTA提供了跨越Session的事务管理能力,即可以实现同一事务对应不同的数据库管理。
在JTA中定义了一组Java接口,用于描述JavaEE框架中事务管理器与应用程序、资源管理器以及应用服务器之间的事务通信。它主要包括高层接口,
即面向应用程序的接口;XAResource接口,即面向资源的接口;以及事务管理器的接口。值得注意的是,JTA只提供了接口,而没有具体的实现。
JTS(Java Transaction Service)是服务OTS的JTA的实现,即JTS实现了JTA接口。
要使用JTA事务,必须使用XADataSource来产生数据库连接,产生的连接为一个XA连接。XA连接 (javax.sql.XAConnection)和非XA连接(java.sql.Connection)的区别在于:
XA可以参与JTA的事务,且不支持自动提交。要用JTA进行事务界定,则应用程序需要调用javax.transaction.UserTransaction,
它使用 begin()、commit()和rollback()方法来完成事务范围的界定及事务的提交和回滚。
下面是一个使用JBoss容器对提供的JTA事务进行控制的实例:
javax.transaction.UserTransaction tx = null;
java.sql.Connection conn1 = null;
java.sql.Connection conn2 = null;
try{
//取得JTA事务,在本例中由JBoss容器来管理
tx = (javax.transaction.UserTransaction)context.lookup("java:comp/UserTransaction");
//取得数据库连接池,必须有XA的数据库、驱动程序
DataSource ds1 = (javax.sql.DataSource) context.lookup("java:/XAOracleDS");
DataSource ds2 = (javax.sql.DataSource) context.lookup("java:/XASQLServerDS");
//开始事务
tx.begin();
//取得数据库连接
conn1 = ds1.getConnection();
conn2 = ds2.getConnection();
Statement stm1 = conn1.createStatement();
Statement stm2 = conn2.createStatement();
//数据库插入操作
stm1.executeUpdate("insert into(username,password,email) user values(1,'admin','admin','xtlog@163.com')");
stm1.close();
//数据库更新操作
stm2.executeUpdate("update user set email='xiugai@123.com' where id=1" );
stm2.close();
//提交事务
tx.commit();
}catch(Exception e){
try{
tx.rollback();
}catch(Exception e){
e.printStackTrace();
}
}finally{
//关闭连接
}
以上的事务处理对象tx是从JBoss容器中取得的。数据库连接操作是在事务开始之后进行,这样就实现了多数据库的事务管理。