繁体   English   中英

两个数据库上的两个事务

[英]Two transactions on two databases

我需要将多个值放入2个数据库中。 问题是,如果其中的一个INSERTS失败,我需要的所有其他回滚。

问题是否可能同时进行两个事务,将一些值插入数据库,然后Commitrollback它们两者?

编码

$res = new ResultSet(); //class connecting and letting me query first database
$res2 = new ResultSet2(); //the other database
$res->query("BEGIN");
$res2->query("BEGIN");

try
{
    $res->query("INSERT xxx~~") or wyjatek('rollback'); //wyjatek is throwing exception if query fails
    $res2->query("INSERT yyy~~")or wyjatek('rollback');
    ......
    //if everything goes well
    $res->query("COMMIT");
    $res2->query("COMMIT");
    //SHOW some GREEN text saying its done.
}
catch(Exception $e)
{
   //if wyjatek throws an exception
   $res->query("ROLLBACK");
   $res2->query("ROLLBACK");
   //SHOW some RED text, saying it failed
}

总结那么这是正确的方法,还是行得通?

所有提示赞赏。

理论上

如果您要删除

或wyjatek('rollback')

您的脚本将起作用。

但是寻找文档

事务被隔离在单个“数据库”中。 如果要使用MySql使用多个数据库事务,则可以看到XA Transactions

InnoDB存储引擎可以使用XA事务支持。

XA支持分布式事务,即允许多个单独的事务资源参与全局事务的能力。 事务性资源通常是RDBMS,但可能是其他类型的资源。

应用程序执行涉及不同数据库服务器的操作,例如MySQL服务器和Oracle服务器(或多个MySQL服务器),其中涉及多个服务器的操作必须作为全局事务的一部分发生,而不是作为每个服务器本地的独立事务发生。

XA规范。 本文档由The Open Group发布,可在http://www.opengroup.org/public/pubs/catalog/c193.htm上找到。

您提出的建议几乎总是可行的。 但是对于某些用途,“几乎总是”还不够好。

如果您推迟了约束,则在$ res2上的提交可能会因违反约束而失败,因此回滚$ res为时已晚。

或者,您的服务器或网络之一可能在第一次提交和第二次提交之间失败。 如果php,database1和database2都在同一硬件上,则此故障模式的窗口很小,但不能忽略。

如果“几乎总是”不够好,并且您无法迁移一组数据以驻留在另一个数据库中,那么您可能需要诉诸“准备好的交易”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM