先写个题目 前段时间看了看这些标准 其实就是定制的一系列的接口规则,然后那些框架其实就是利用这些来写,所以 这些貌似是基础中的基础 这段时间 来组织组织这些,呼呼 最近在看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();
1.UserTransaction是 面向开发人员的接口
2.我们下面来看下JNDI怎么获取这个分布式事务管理器
//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规范