JavaEE 基准学习 JTA 事务管理

JavaEE 标准学习 JTA 事务管理

先写个题目 前段时间看了看这些标准  其实就是定制的一系列的接口规则,然后那些框架其实就是利用这些来写,所以 这些貌似是基础中的基础 这段时间 来组织组织这些,呼呼 最近在看restlet,这就涉及到javaee中的JAX-WS  JAX-RS 等等规范,不过 我还是想从 JTA 事务开始学起。。。。呼呼 这个是开篇,后续更新

 

    说起事务,总是联想到Spring aop,或者就是@transaction标签,再或者就是各种框架的集成

今天从基本的开始说起,

 

    首先是最基本的 JDBC 编程,一个数据源,我们可以用最基本的

    conn.setAutoCommit(false)来开启 事务,最后调用conn.commit(); 来提交事务就可以了.

 

    这是在一个数据源的情况下,如果我这边有两个数据库,从从不同的数据库来操作要保证事务呢

    这时候就要用到J2ee标准中的 JTA  和 JTS   事务编程接口和事务服务

 

    先不说理论,看看怎么用

userTx = (UserTransaction)getContext().lookup("   
javax.transaction.UserTransaction"); 
	// 从数据库 A 中取得数据库连接
	 connA = getDataSourceA().getConnection(); 
			
	// 从数据库 B 中取得数据库连接
	 connB = getDataSourceB().getConnection(); 
      
        // 启动事务
	 userTx.begin();

 
JavaEE 基准学习  JTA 事务管理
 

 

1.UserTransaction是 面向开发人员的接口

2.我们下面来看下JNDI怎么获取这个分布式事务管理器

 

tomcat6配置jndi,jta
 如果你的项目准备部署在tomcat上,要支持jta,则需把相关的包放在tomcat/lib包下
 1)jndi配置,可以把jndi的配置放置在  tomcat/conf/Catalina/域名(如localhost)/项目名.xml
   文件的Context节点下,如下:
   <Resource name="" auth="Container" type="javax.sql.DataSource" 
username="" 
password=""
driveClassName="oracle.jdbc.driver.OracleDriver" 
url="" maxActive="45" maxIdle="25"/>
    jndi也可以配置在server.xml,context.xml中
  2)jta UserTransaction配置
  在server.xml文件GlobalNamingResources节点下配置如下:
    <!-- Resource configuration for UserTransaction
         use JOTM -->
    <Resource name="UserTransaction" auth="Container"
        type="javax.transaction.UserTransaction"
        factory="org.objectweb.jotm.UserTransactionFactory"
        jotm.timeout="60"/>
  然后在 项目名.xml 文件的context节点下加:
   <ResourceLink name="UserTransaction"
            global="UserTransaction"

 

            type="javax.transaction.UserTransaction"/

//1.由于tomcat不支持JTA 所以 要引入JOTM来支持,这个搜一搜就好了,很多,这样,我们就配置完tomcat //和JTA 了。然后基本代码就是从JNDI中找到JTA 然后基本的 begin commit 就行了。。这是基本的 ,明天看//下String+JTA的整合

 

 2  多说两句

 

上面写的UserTranscation 是用户接口,那当我们调用UserTranscation的时候,发生了什么事情呢

,这里就要说到JTA标准中的 三个接口  (1)userTranscation (2)TranscationManager(3) Transcation

 

简单的说 userTranscation调用begin的时候  然后调用transcarionManager,然后呢,TranscationManage里面有个threadlocal,这个就很明了了,每个线程都有自己的manager manager再调用Transcation的begin。好吧 其实就是这样,改天看看源码把这个贴上来。

 

------------------------------------我是分界线-----------------------------------------------

纸上谈兵终究是要一败涂地的

 

最新的Spring 3.0 已经不支持Jtom 所以上面的我就注释了 下面就直接看代码吧

 

<!-- 配置JTA 数据源 -->

<!-- 配置atomikos的事务管理器 -->  

    <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"  

        init-method="init" destroy-method="close">  

        <property name="forceShutdown" value="true" />  

    </bean>  

    <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">  

        <property name="transactionTimeout" value="300" />  

    </bean>  

    <!-- spring的JTA事务管理器 -->  

    <bean id="springTransactionManager"  

        class="org.springframework.transaction.jta.JtaTransactionManager">  

        <property name="transactionManager" ref="atomikosTransactionManager" />  

        <property name="userTransaction" ref="atomikosUserTransaction" />  

    </bean> 

 

MAVEN  引入 

 <dependency>

    <groupId>com.atomikos</groupId>

    <artifactId>transactions-jta</artifactId>

    <version>3.7.0</version>

    </dependency>

 

再加上上面的配置 就能得到 一个事物管理对象了 

 

@Autowired

JtaTransactionManager springTransactionManager;

 

 

 

简单看了下atomikos 的源码 思想和上面说的差不多 三个接口 userTranscation TranscationManager Transcation 

 

不过 他们这里的 TranscationManager是自己实现了一个线程安全的方式 类似于一个threadlocal 不过是自己实现的BaseTransactionManager,其中就有hashtable 来分配线程

 

TransactionImp 这个就是真正执行事务的那个类了  具体的没怎么看了 具体实现还是比较复杂的。。。不过 现在我们已经得到了 UserTranscation这个开发人员接口了 接下来 就用就ok了

 

 

 ---------------

最后补充下  分布式事务可以再很多场合下使用,比如 JMS 中 来控制事务的完整性。。

 

接下来 我们就来看看JMS规范