Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 一阶段和两阶段(XA)提交之间的实际差异_Database_Jakarta Ee_Jpa_Commit_Xa - Fatal编程技术网

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

Database 一阶段和两阶段(XA)提交之间的实际差异,database,jakarta-ee,jpa,commit,xa,Database,Jakarta Ee,Jpa,Commit,Xa,有人能澄清一下一阶段提交和两阶段提交之间的区别吗。据我所知,一阶段提交表示应用程序服务器(Service method->EntityManager)过程中的提交,XA提交是数据库(Service method->EntityManager->DB)的同一事务,用于正确回滚整个事务。那么,我们为什么不默认使用XA驱动程序呢?这只是性能问题吗? 如果我错了,请纠正我。区别在于一个阶段提交通常用于一个系统或数据库,而两个阶段提交用于跨多个数据库或系统的分布式事务。让我为您展示每种方法的简单示例 一阶

有人能澄清一下一阶段提交和两阶段提交之间的区别吗。据我所知,一阶段提交表示应用程序服务器(Service method->EntityManager)过程中的提交,XA提交是数据库(Service method->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;
//pseodocode
BEGIN
    UPDATE db1; //updates DB on another machine
    UPDATE someCloudStorage; //update something on the cloud
    INSERT INTO SomeTable VALUES(...);
COMMIT;
这是用PL/SQL编写的经典原子事务(对于JavaEE世界,想象一下EJB方法也可以是事务性的),只有一个阶段执行所有操作,并执行提交或回滚

两阶段提交

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;
//pseodocode
BEGIN
    UPDATE db1; //updates DB on another machine
    UPDATE someCloudStorage; //update something on the cloud
    INSERT INTO SomeTable VALUES(...);
COMMIT;
现在,您在不同的机器上处理不同的系统,但您希望成功地写入所有系统或失败(这就是为什么它是分布式事务)。因此,这是一个好消息。基本上,事务管理器广播“准备提交”消息,然后等待来自每台机器的OK响应。如果每个人都说“没问题”,那么所有事情都会被提交——如果没有,那么所有事务都会回滚

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