`

JTA事务简述

 
阅读更多

Java事务API(Java Transaction API,简称JTA )是一个Java企业版的应用程序接口,在Java环境中,允许完成跨越多个XA资源的分布式事务。

 

JTA和它的同胞Java事务服务(JTS;Java TransactionService),为J2EE平台提供了分布式事务服务。不过JTA只是提供了一个接口,并没有提供具体的实现,而是由j2ee服务器提供商 根据JTS规范提供的,常见的JTA实现有以下几种:

1、J2EE容器所提供的JTA实现(JBoss)

2、独立的JTA实现:如JOTM,Atomikos.这些实现可以应用在那些不使用J2EE应用服务器的环境里用以提供分布事事务保证。如Tomcat,Jetty以及普通的java应用。

 

JTA里面提供了 java.transaction.UserTransaction ,里面定义了下面几个方法:

1、begin:开启一个事务

2、commit:提交当前事务

3、rollback:回滚当前事务

4、setRollbackOnly:把当前事务标记为回滚

5、setTransactionTimeout:设置事务的事件,超过这个事件,就抛出异常,回滚事务

 

这里,值得注意的是,不是使用了UserTransaction就能把普通的JDBC操作直接转成JTA操作,JTA对DataSource、Connection和Resource 都是有要求的,只有符合XA规范,并且实现了XA规范的相关接口的类才能参与到JTA事务中来,关于XA规范,目前主流的数据库都支持XA规范。

 

要想使用用 JTA 事务,那么就需要有一个实现javax.sql.XADataSource、javax.sql.XAConnection和javax.sql.XAResource接口的JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection 对象的工厂。XAConnection 是参与 JTA 事务的 JDBC 连接。

 

要使用JTA事务,必须使用XADataSource来产生数据库连接,产生的连接为一个XA连接。

 

XA连接(javax.sql.XAConnection)和非XA(java.sql.Connection)连接的区别在于:XA可以参与JTA的事务,而且不支持自动提交。

 

public void JtaTransfer() { 
        javax.transaction.UserTransaction tx = null;
        java.sql.Connection conn = null;
         try{ 
             tx = (javax.transaction.UserTransaction) context.lookup("java:comp/UserTransaction");  //取得JTA事务,本例中是由Jboss容器管理
             javax.sql.DataSource ds = (javax.sql.DataSource) context.lookup("java:/XAOracleDS");  //取得数据库连接池,必须有支持XA的数据库、驱动程序  
             tx.begin();
            conn = ds.getConnection();
 
             // 将自动提交设置为 false,
             //若设置为 true 则数据库将会把每一次数据更新认定为一个事务并自动提交
             conn.setAutoCommit(false);
 
             stmt = conn.createStatement(); 
             // 将 A 账户中的金额减少 500 
             stmt.execute("\
             update t_account set amount = amount - 500 where account_id = 'A'");
             // 将 B 账户中的金额增加 500 
             stmt.execute("\
             update t_account set amount = amount + 500 where account_id = 'B'");
 
             // 提交事务

              tx.commit();

             // 事务提交:转账的两步操作同时成功

         } catch(SQLException sqle){            

             try{ 

                 // 发生异常,回滚在本事务中的操做

              tx.rollback();

                 // 事务回滚:转账的两步操作完全撤销

                 stmt.close(); 

                 conn.close(); 

             }catch(Exception ignore){ 

 

             } 

             sqle.printStackTrace(); 

         } 

     }

上面的例子就是一个使用JTA事务的转账操作,该操作相对依赖于J2EE容器,并且需要通过JNDI的方式获取UserTransaction和Connection。

 

标准的分布式事务

 

一个分布式事务(Distributed Transaction)包括一个事务管理器(transaction manager)和一个或多个资源管理器(resource manager)。一个资源管理器(resource manager)是任意类型的持久化数据存储。事务管理器(transaction manager)承担着所有事务参与单元者的相互通讯的责任,JTA的实现方式也是基于以上这些分布式事务参与者实现的。

 

JTA的优缺点(标准的JTA方式的事务管理在日常开发中并不常用)

优点:提供了分布式事务的解决方案,严格的ACID。

缺点:

1、实现复杂

2、通常情况下,JTA UserTransaction需要从JNDI获取。这意味着,如果我们使用JTA,就需要同时使用JTA和JNDI。

3、JTA本身就是个笨重的API,通常JTA只能在应用服务器环境下使用,因此使用JTA会限制代码的复用性。

 

总结

Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务,其中JDBC的事务操作用法比较简单,适合于处理同一个数据源的操作。JTA事务相对复杂,可以用于处理跨多个数据库的事务,是分布式事务的一种解决方案。

 

这里还要简单说一下,虽然JTA事务是Java提供的可用于分布式事务的一套API,但是不同的J2EE平台的实现都不一样,并且都不是很方便使用,所以,一般在项目中不太使用这种较为复杂的API。现在业内比较常用的分布式事务解决方案主要有异步消息确保型、TCC、最大努力通知等。

分享到:
评论

相关推荐

    J2EE面试题集锦(附答案)

    JTA提供了分布式事务处理的API,允许应用程序管理跨越多个数据源的事务。通过JTA,可以确保在一个事务中涉及的所有操作要么全部成功,要么全部回滚,实现ACID(原子性、一致性、隔离性、持久性)属性,保证了数据的...

    总结部分的框架和开源项目.pdf

    此外,它还提供了一致的事务管理模型,无论是JTA还是JDBC事务。Spring的AOP框架允许在POJO上实现声明式事务管理和其他企业服务。最后,Spring MVC框架为Web应用提供了强大的后端支持。 2. **WebWork** - **简介**...

    hibernateJAR包

    JTA (Java Transaction API) 是Java平台提供的一套事务处理规范,主要应用于EJB容器中。在Hibernate中使用JTA可以实现分布式事务处理,这对于企业级应用来说是非常重要的特性之一。通过jta.jar,开发者能够确保数据...

    jBPM4.1中文用户手册.pdf

    - **JTA事务**:探讨了如何与Java事务API集成来处理跨系统事务。 - **用户事务**:说明了如何创建自定义的事务管理器来满足特定需求。 #### 三、BPMN2.0 - **BPMN2.0是什么**:解释了BPMN2.0的基本概念及其在流程...

    Java项目开发全程实录

    它包括一系列标准和技术,如Servlet、JSP(JavaServer Pages)、EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JTA(Java Transaction API)等。这些技术为开发人员提供了处理Web服务、数据库连接、...

    hibernate4.1中文api

    - **当前会话上下文管理与JTA**: 与JTA事务协同工作。 - **JMX部署**: 通过JMX进行部署。 #### 4. 持久化类 - **简单的POJO示例**: - 实现无参数构造函数。 - 提供标识符属性。 - 非final类。 - 声明访问器...

    hibernate 中文参考手册

    - **JTA 简介**:介绍 Java 事务 API (JTA)。 - **上下文管理**:解释如何管理当前会话的上下文。 **3.9.4 JMX 部署** - **JMX 部署**:讲解如何通过 JMX 部署 Hibernate。 #### 四、持久化类 ##### 4.1 简单的 ...

    hibernate 帮助文档

    - **在JTA环境下使用CurrentSessioncontext管理**:配置`SessionFactory`以支持JTA事务管理。 - **JMX部署**:如何使用JMX进行部署和管理。 #### 四、持久化类(Persistent Classes) **4.1 一个简单的POJO例子** ...

    java ee 1.5 1.6 api

    以上只是Java EE 1.5/1.6中部分关键API和概念的简述,实际使用中还需要了解更多的细节,如异常处理、安全、事务管理等。查阅`j2ee_api_6`文档将有助于深入理解这些技术,并在实际项目中灵活运用。

    java面试200题(1)

    - **JTA**: Java事务API,用于管理事务。 ### 13. 字符串编码转换 文档给出了一段示例代码用于字符串编码转换,将字符串从ISO-8859-1编码转换为GBK编码。 ### 14. 位运算符详解 文档还简单介绍了Java中的位运算符...

    超级有影响力霸气的Java面试题大全文档

    31、EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?  SessionBean: Stateless Session Bean 的生命周期是由容器决定的,当客户机发出请求要建立一个Bean的实例时,EJB容器不一定要创建...

    java面试题

    59.5. JTA 41 59.6. JAF 41 59.7. RMI/IIOP 41 60. JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗? 41 61. MVC的各个部分都有那些技术来实现?如何...

    J2EE面试题(附有答案)

    - **JTA (Java Transaction API)**:提供了分布式事务管理的支持。 - **JAF (Java Action Framework)**:提供了一个框架来处理用户界面的操作和安全认证。 - **RMI (Remote Method Invocation)**:允许程序调用位于...

    java笔试题

    - JTA:处理事务管理。 - JMS:消息服务。 **SessionBean**和**EntityBean**的区别在于: - **SessionBean**用于实现业务逻辑,分为**StatefulBean**和**StatelessBean**两种。 - **StatefulBean**能够维护客户端...

Global site tag (gtag.js) - Google Analytics