zoukankan      html  css  js  c++  java
  • JTA(XA)原理解析

    昨天讲了java事务,由于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, 大体的过程如下 
     

    在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部分,讲的很不错,找个机会我将翻译下

  • 相关阅读:
    sql server 2008 R2突然用windows和sa都无法登录。昨天都还能登陆,今天突然不行。
    JSON
    String类型判断是否一致
    5-4利用选取事件实时修改订单
    5-3以复选框创建餐点选项
    mysql创建存储过程
    margin标记可以带一个、二个、三个、四个参数,各有不同的含义。
    CSS字间距
    Html合并单元格
    MySQL Innodb存储引擎 事务隔离级别 锁 理解
  • 原文地址:https://www.cnblogs.com/muyuge/p/6152668.html
Copyright © 2011-2022 走看看