`

关于JTA

阅读更多

JTA(Java Transaction API) 为 J2EE 平台提供了分布式事务服务。
  要用 JTA 进行事务界定,应用程序要调用 javax.transaction.UserTransaction 接口中的方法。例如:
  utx.begin();
  // ...
  DataSource ds = obtainXADataSource();
  Connection conn = ds.getConnection();
  pstmt = conn.prepareStatement("UPDATE MOVIES ...");
  pstmt.setString(1, "Spinal Tap");
  pstmt.executeUpdate();
  // ...
  utx.commit();
  让我们来关注下面的话:
  “用 JTA 界定事务,那么就需要有一个实现 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection 对象的工厂。 XAConnection s 是参与 JTA 事务的 JDBC 连接。”
  要使用JTA事务,必须使用XADataSource来产生数据库连接,产生的连接为一个XA连接。
  XA连接(javax.sql.XAConnection)和非XA(java.sql.Connection)连接的区别在于:XA可以参与JTA的事务,而且不支持自动提交。
  Note:
  Oracle, Sybase, DB2, SQL Server等大型数据库才支持XA, 支持分布事务。
  My SQL 连本地都支持不好,更别说分布事务了。
  MySql 在5.0的版本后增加了对xa的支持
  JTA方式的实现过程:
  用XADataSource产生的XAConnection它扩展了一个getXAResource()方法,事务通过这个方法把它加入到事务容器中进行管理.对于调用者来说,根本看不到事务是如果管理的,你只要声明开始事务,告诉容器我下面的操作要求事务参与了,最后告诉事务说到这儿可以提交或回滚了,别的都是黑箱操作。
  在使用JTA之前,你必须首先实现一个Xid类用来标识事务(在普通情况下这将由事务管理程序来处理)。Xid包含三个元素:formatID、gtrid(全局事务标识符)和bqual(分支修饰词标识符)。
  下面的例子说明Xid的实现:
  import javax.transaction.xa.*;
  public class MyXid implements Xid
  {
  protected int formatId;
  protected byte gtrid[];
  protected byte bqual[];
  public MyXid()
  {
  }
  public MyXid(int formatId, byte gtrid[], byte bqual[])
  {
  this.formatId = formatId;
  this.gtrid = gtrid;
  this.bqual = bqual;
  }
  public int getFormatId()
  {
  return formatId;
  }
  public byte[] getBranchQualifier()
  {
  return bqual;
  }
  public byte[] getGlobalTransactionId()
  {
  return gtrid;
  }
  }
  其次,你需要创建一个你要使用的数据库的数据源:
  public DataSource getDataSource()
  throws SQLException
  {
  SQLServerDataSource xaDS = new
  com.merant.datadirect.jdbcx.sqlserver.SQLServerDataSource();
  xaDS.setDataSourceName("SQLServer");
  xaDS.setServerName("server");
  xaDS.setPortNumber(1433);
  xaDS.setSelectMethod("cursor");
  return xaDS;
  }
  例1?这个例子是用“两步提交协议”来提交一个事务分支:
  XADataSource xaDS;
  XAConnection xaCon;
  XAResource xaRes;
  Xid xid;
  Connection con;
  Statement stmt;
  int ret;
  xaDS = getDataSource();
  xaCon = xaDS.getXAConnection("jdbc_user", "jdbc_password");
  xaRes = xaCon.getXAResource();
  con = xaCon.getConnection();
  stmt = con.createStatement();
  xid = new MyXid(100, new byte[], new byte[]);
  try {
  xaRes.start(xid, XAResource.TMNOFLAGS);
  stmt.executeUpdate("insert into test_table values (100)");
  xaRes.end(xid, XAResource.TMSUCCESS);
  ret = xaRes.prepare(xid);
  if (ret == XAResource.XA_OK) {
  xaRes.commit(xid, false);
  }
  }
  catch (XAException e) {
  e.printStackTrace();
  }
  finally {
  stmt.close();
  con.close();
  xaCon.close();
  }
  当然,实际过程中,我们不需要写这些代码,这些代码是JTA最终的实现代码。
  关于“两步提交协议”,可以参看下面的文章:
  http://www.jspcn.net/htmlnews/11049371131251752.html
  http://www.vermicelli.pasta.cs.uit.no/ipv6/students/andrer/doc/html/node18.html
  选择最好的方式
  用 JDBC API 进事务界定来构建 DAO 类的。这些 DAO 类可以总结如下:
  事务界定代码嵌入在 DAO 类中。
  DAO 类使用 JDBC API 进行事务界定。
  调用者不能界定事务。
  事务范围局限于单个 JDBC 连接。
  JDBC 事务并不总是适合复杂的企业应用程序。如果您的事务要跨越多个 DAO 或者多个数据库,那么下列实现策略也许更合适:
  事务用 JTA 界定。
  事务界定代码从 DAO 中分离出来。
  调用者负责界定事务。
  DAO 加入一个全局事务。
  JDBC 方式由于其简单性而具有吸引力,JTA 方式提供了更大的灵活性。您所选择的实现将取决于应用程序的特定需求。
  XADataSource例子:
  <?xml version="1.0" encoding="UTF-8"?>
  <!-- ===================================================================== -->
  <!-- -->
  <!-- JBoss Server Configuration -->
  <!-- Thanks to Horia Muntean <horia@bvb.ro> -->
  <!-- ===================================================================== -->
  <!-- $Id: db2-xa-ds.xml,v 1.1.2.1 2003/05/30 18:25:57 d_jencks Exp $ -->
  <datasources>
  <!--
  XADatasource for DB2 V8.1 (app driver)
  copy $db2_install_dir/java/db2java.zip into $jboss_install_dir/server/default/lib
  -->
  <xa-datasource>
  <jndi-name>DB2XADS</jndi-name>
  <xa-datasource-class>COM.ibm.db2.jdbc.DB2XADataSource</xa-datasource-class>
  <xa-datasource-property name="DatabaseName">yout_database_name</xa-datasource-property>
  <xa-datasource-property name="User">your_user</xa-datasource-property>
  <xa-datasource-property name="Password">your_password</xa-datasource-property>
  </xa-datasource>
  </datasources>

分享到:
评论

相关推荐

    JAVA JTA jar-doc-spec

    在这个“JAVA JTA jar-doc-spec”压缩包中,包含的是关于JTA的文档和规范文件。 JTA的核心概念包括: 1. **事务(Transaction)**:事务是一组操作,这些操作要么全部成功,要么全部失败,遵循ACID原则。ACID分别...

    springboot整合JTA组件,多数据源事务管理

    、JTA组件简介 1、JTA基本概念 JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序对JTA的支持极大地增强了数据访问能力。 XA协议是...

    jta.jar包;jta.jar包

    Java Transaction API(JTA)是Java平台上的标准接口,用于管理分布式事务处理。jta.jar文件是这个API的实现库,它包含了一系列类和接口,允许应用程序在不同的数据存储系统间进行协调一致的事务操作。在Java应用中...

    最新的JTA规范.pdf

    ### 最新的JTA规范:Java事务API概览与解析 #### 核心概念与功能 **JTA(Java Transaction API)规范**是Java平台中处理分布式事务管理的关键组件,它定义了事务管理器与分布式系统中各个参与方之间的高级接口。...

    jta使用手册,jta帮助文档jta使用手册,jta帮助文档

    ### Java Transaction API (JTA) 使用手册与帮助文档解析 #### 概述 Java Transaction API(JTA)是Java平台中用于处理分布式事务的核心技术之一。JTA规范定义了事务管理器与分布式事务系统中各方参与者(应用、...

    Jta的jar包

    描述中提到了"jbarcode-0.2.8"和"jbarcodebean-1.2.0",这是关于Java条形码生成库JBarcode的不同版本,但主要关注点是JTA,因为"jta-1.0.1B"和"jta-1.1"再次被提及。这表明讨论的是用于处理分布式事务的Java技术。 ...

    最新的 jta包 用于quartz缺少jar

    因此,确保Quartz的配置文件(如`quartz.properties`)中关于事务管理的部分是正确的至关重要。 在给定的压缩包文件`jta-1.3.1(1)`中,我们可以看到JTA的一个版本。JTA 1.3.1是JTA的较新版本,包含了处理分布式事务...

    JTA1.1规范(sun)

    在文档中,你可以找到关于UserTransaction、TransactionManager、XAResource等关键接口的详细说明。这些接口是实现跨不同数据源的事务一致性的重要组成部分。UserTransaction允许应用程序开始、提交、回滚事务,而...

    spring jta

    由于无法直接访问该链接,以下将提供一些关于Spring JTA的一般性知识。 1. **Spring JTA的配置**: - XML配置:在`&lt;beans&gt;`标签内定义`&lt;tx:annotation-driven/&gt;`,指定事务管理器为JTA类型,如`...

    Spring配置JTA事务管理

    Spring框架在企业级Java应用中广泛用于实现事务管理,而JTA(Java Transaction API)是Java平台上的标准事务处理API,适用于分布式环境。本篇文章将深入探讨如何在Spring中配置JTA事务管理,以实现跨数据库和资源的...

    quartz_jta_collections

    在标题"quartz_jta_collections"中,我们看到与Quartz相关的三个关键组件:quartz-all-1.6.0.jar、jta-1.1.jar和commons-collections.jar。这些组件对于理解Quartz如何在分布式环境中运行以及它如何处理数据集合至关...

    jta1.1.jar jta1.3.1.jar

    最近往javaEE项目中集成quartz2.2.1时,要用到jta的jar包,下载了最新版的jta-4.0.jar后,发现不能使用,于是又下载了1.1和1.3.1版本的jar包,比较了一下,发现4.0版本的jar包,包名跟以前版本的不一样。quartz2.2.1...

    geronimo-jta_1.1_spec-1.1.1.jar

    `geronimo-jta_1.1_spec-1.1.1.jar`是Apache Geronimo项目提供的一份关于Java Transaction API (JTA) 1.1规范的实现,它是Java EE平台的核心部分,用于管理分布式事务。本篇将详细解析这个jar包在Hibernate框架中的...

    分布式事务操作之Spring+JTA+mybatis源码

    本话题主要聚焦于如何在Spring框架中结合Java Transaction API (JTA) 和 MyBatis 实现分布式事务管理。下面我们将详细探讨相关知识点。 1. **分布式事务**:在分布式系统中,事务处理跨越多个资源或服务,例如...

    jta1.1-doc

    - **help-doc.html**:帮助文档,提供了关于如何使用和理解JTA 1.1的指南。 - **overview-tree.html**:包和类的层次结构,展示了JTA 1.1 API的组织结构。 - **overview-summary.html**:概述摘要,简要介绍了JTA...

    EJB中的JTA与JTS例子代码

    EJB中的JTA与JTS例子代码,JTA是一种高层的,与实现无关的,与协议无关的J2ee API,应用程序和应用服务器可以使用JTA来访问事务。JTS则规定了支持JTA的事务管理器的实现规范,在高层API之下实现了OMG Object ...

    Springboot 动态多数据源 jta分布式事务

    本资源针对的是Spring Boot动态多数据源和JTA(Java Transaction API)分布式事务的实现,对于初学者来说非常实用。下面我们将深入探讨这些知识点。 首先,让我们了解一下Spring Boot的多数据源。在许多业务场景下...

    java实现JTA简单例子

    Java JTA,全称为Java Transaction API,是Java平台上的事务处理标准,用于管理跨系统或跨资源的事务。它提供了一种统一的方式来控制应用程序中的事务,使得开发者可以在不同的数据库、消息队列等资源之间进行协调,...

    springboot+jta+atomikos

    本项目“springboot+jta+atomikos”旨在利用Spring Boot框架、Java Transaction API (JTA) 和 Atomikos 这一开源事务管理器来实现分布式事务的统一管理。下面将详细阐述这三个关键组件以及它们如何协同工作。 **...

    JTA1.2规范

    ### JTA 1.2 规范详解 #### 一、引言 Java Transaction API (JTA) 是一种用于管理分布式事务的高级接口规范。它定义了事务管理器与分布式事务系统中的各参与方(应用、资源管理器及应用服务器)之间的交互方式。JTA...

Global site tag (gtag.js) - Google Analytics