JTA(XA)原理解析

Transaction(事务) 分两种

Local Transaction 和 Global Transaction
涉及到一个Connection的Commit,称为Local Transaction
涉及到多个Connection的Commit,称为Global Transaction

Local Transaction用JDBC事务实现是没有问题,然而Global Transaction的实现就无法保证了,所以不得不了解下JTA的神奇,但其实这样的事务也是存在问题的,下面将指出

XA需要两阶段提交 – prepare 和 commit.
假设有两个Connection, con1, con2, 大体的过程如下

con1 = XAResouce1.getConnection...     
con2 = XAResouce2.getConnection...     
    
con1 do some thing.     
con2 do some thing.     
after they finish.     
    
pre1 = XAResouce1.prepare();     
pre2 = XAResouce2.prepare();     
    
if( both pre1 and pre2 are OK){     
XAResouce1 and 2 commit     
}else {     
XAResouce1 and 2 rollback     
}    

在XAResouce1 and 2 commit的时候,
可能XAResouce1 commit() 成功了,XAResouce2 commit()失败了。
这时候,会抛出一个 “启发式异常”。程序可以处理这个异常。比如,XAResouce.recover()之类。
但一般情况下,还真没别的办法,需要数据管理员根据数据操作日志 undo所有的操作,或者恢复数据备份。
有的数据库在进行数据操作的时候,会生成一个“反操作”日志。比如,insert 对 delete, 等。

Global Transaction 需要XA接口(包括在JTA里面)的支持。

import javax.sql.XAConnection; 
import javax.transaction.xa.Xid; 
import javax.transaction.xa.XAResource; 
import javax.transaction.xa.XAException; 
import javax.transaction.Transaction; 
import javax.transaction.TransactionManager;

其中的

javax.sql.XAConnection; 
javax.transaction.xa.Xid; 
javax.transaction.xa.XAResource;

这些XA接口的实现,需要数据库的JDBC提供。
数据库本身要支持XA。数据库的JDBC也要提供XA的实现。

Oracle, Sybase, DB2, SQL Server等大型数据库支持XA

免费的postreSQL也支持XA
My SQL 连Local Transaction都支持不好,更别说Global Transation了。

TransactionManager的实现能够处理多个XAResouce(一个XAResouce list)的情况。
比如Tyrex。或JBoss等EJB Server的Transaction实现代码

下面转载一篇讲解XA的详细原理解析 http://jroller.com/pyrasun/category/XA 共分3部分,讲的很不错,找个机会我将翻译下

转自:JTA(XA)原理解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈振阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值