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

  • 相关阅读:
    【.net】未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序解决办法
    【JS】JavaScript中Null和undefind区别
    【SQL】SQL中on条件与where条件的区别
    【C#】C#创建自定义Object对象
    【.NET】asp.net Redirect 图片路径
    【JQ】jq动态绑定事件.on()、解绑事件off()
    【.NET】using 语句中使用的类型必须可隐式转换为"System.IDisposable"
    C# enum、int、string三种类型互相转换
    js中Date与timestamp(时间戳)的相互转换
    2. 自动化运维系列之Cobbler给Openstack节点安装操作系统。
  • 原文地址:https://www.cnblogs.com/waka401/p/2721198.html
Copyright © 2020-2023  润新知