JTA和两阶段提交,处理全局事务
2012-09-17 09:59
260 查看
1. Transaction 分两种,Local Transaction 和 Global Transaction。
涉及到一个Connection的Commit,称为Local Transaction。
涉及到多个Connection的Commit,称为Global Transaction。
楼主提到的是,Global Transaction.
2. 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, 支持Global Transaction。
My SQL 连Local Transaction都支持不好,更别说Global Transation了。
3. 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, 等。
4. TransactionManager的实现能够处理多个XAResouce(一个XAResouce list)的情况。
比如Tyrex。或JBoss等EJB Server的Transaction实现代码。
涉及到一个Connection的Commit,称为Local Transaction。
涉及到多个Connection的Commit,称为Global Transaction。
楼主提到的是,Global Transaction.
2. 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, 支持Global Transaction。
My SQL 连Local Transaction都支持不好,更别说Global Transation了。
3. 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, 等。
4. TransactionManager的实现能够处理多个XAResouce(一个XAResouce list)的情况。
比如Tyrex。或JBoss等EJB Server的Transaction实现代码。
相关文章推荐
- 两阶段提交(2PC)协议与XA事务处理
- 分布式事务处理两阶段提交实例
- 分布式事务处理两阶段提交实例2及注意
- 分布式事务(一)两阶段提交及JTA
- 分布式事务(一)两阶段提交及JTA
- PGXC两阶段提交与事务一致性(1)
- 分布式事务之两阶段提交(2pc)
- 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究
- 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究
- 利用 JTA 处理事务机制与原理
- 关于分布式事务、两阶段提交协议、三阶提交协议
- 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究
- TCC和两阶段分布式事务处理的区别
- 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究
- 事务和两阶段提交
- liuyangming/ByteJTA: ByteJTA Transaction Manager旨在提供一个常规的基于XA两阶段提交的分布式事务管理器。
- [Oracle] 分布式事务和两阶段提交(2PC)
- 事务处理总结【JDBC事务|JTA事务|容器事务
- 分布式跨数据库的事务处理解决方案jta
- 关于分布式事务、两阶段提交协议、三阶提交协议