Java事务管理学习二 JTA的事务管理机制

JTA提供的是分布式的事务管理,其事务管理由JTA容器实现,JTA容器对当前加入事务的众多Connection进行调度,满足其事务性要求。 JTA的事务周期可以横跨多个JDBCConnection生命周期。因此,JTA提供了跨越Session的事务管理能力,即可以实现同一事务对应不同 的数据库管理,这一点是和上文中JDBC事务最大的不同。

    在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容器中取得的。数据库连接操作是在事务开始之后进行,这样就实现了多数据库的事务管理。

原文地址:https://www.cnblogs.com/waka401/p/2721198.html