有人可以澄清单阶段和两阶段提交之间的区别。据我所知,单阶段提交表示在应用程序服务器(服务方法 - > EntityManager)过程中的提交,而XA提交是直到数据库的相同事务(服务方法 - > EntityManager - > DB)并且是用于正确回滚整个事务。那么为什么我们不默认使用XA驱动程序呢?这只是性能问题吗? 如果我错了,请纠正我。
答案 0 :(得分:27)
不同之处在于,一阶段提交通常在一个系统或数据库中使用,而两阶段提交用于跨多个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编写的经典原子事务(对于Java EE世界,想象一下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数据源)。