可能有人澄清之间的一个阶段和两阶段提交的差异。据我明白了一阶段提交代表提交在应用服务器的过程中(服务方法 - >的EntityManager)和XA提交是相同事务到数据库(服务方法 - >的EntityManager - > DB),并且为了使用正确回滚整个事务。那么,为什么我们不使用XA驱动程序在默认情况下?这只是性能问题?如果我错了请纠正我。
不同的是,一个阶段提交而两阶段提交用于该跨多个数据块或系统分布式事务一个系统或数据库中通常使用。让我告诉你每一个简单的例子
一阶段提交
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方法),还有就是所有操作都进行,只是一个阶段或者commit或rollback而成。
两阶段提交
//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支持(和正确配置XA数据源)JDBC驱动程序。