代码之家  ›  专栏  ›  技术社区  ›  sidlejinks

一阶段和两阶段(XA)提交之间的实际差异

  •  10
  • sidlejinks  · 技术社区  · 10 年前

    有人能澄清一个阶段和两阶段提交之间的区别吗。据我所知,一个阶段提交表示应用程序服务器过程中的提交(服务方法->EntityManager),XA提交是到数据库的同一事务(服务方法->实体管理器->DB),用于正确回滚整个事务。那么我们为什么不默认使用XA驱动程序呢?这只是性能问题吗? 如果我错了,请纠正我。

    1 回复  |  直到 10 年前
        1
  •  30
  •   Petr Mensik    5 年前

    不同之处在于,一阶段提交通常用于一个系统或数据库,而两阶段提交用于跨多个DB或系统的分布式事务。让我给你举一个简单的例子

    一阶段提交

    BEGIN
       INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
          VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
       INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
          VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
    COMMIT;
    

    这是用PL/SQL编写的经典原子事务(对于JavaEE世界,想象一下EJB方法也可以是事务性的),只有一个阶段执行所有操作,并进行提交或回滚。

    两阶段提交

    //pseodocode
    BEGIN
        UPDATE db1; //updates DB on another machine
        UPDATE someCloudStorage; //update something on the cloud
        INSERT INTO SomeTable VALUES(...);
    COMMIT;
    

    现在,您正在处理不同机器上的不同系统,但您希望成功写入所有系统,否则会失败(这就是为什么它是分布式事务)。所以这里来了 Two-phase commit protocol 基本上,事务管理器广播“准备提交”消息,然后等待来自每台机器的OK响应。如果每个人都说“没事”,那么一切都会被提交——如果没有,那么所有事务都会被回滚。

    注意,如果您想在Java中使用XA事务,则需要一个支持XA的JDBC驱动程序(以及正确配置的XA数据源)。