两个数据库上的两个事务

时间:2014-04-23 06:58:44

标签: php postgresql transactions try-catch

我需要将多个值放入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
}

摘要 它是正确的方式,还是会起作用?

所有提示都表示赞赏。

3 个答案:

答案 0 :(得分:0)

理论上

如果您要删除

  

或wyjatek(' rollback')

你的脚本将会有效。

但期待文档

交易在一个"数据库中被隔离"。如果要使用MySql使用多个数据库事务,可以看到XA Transactions

  

InnoDB存储支持XA transactions   发动机。

     

XA支持分布式事务,即允许的能力   多个独立的交易资源参与全球   交易。事务资源通常是RDBMS,但可能是其他资源   各种资源。

     

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

     

XA规范。这个   文件由The Open Group出版,可在   http://www.opengroup.org/public/pubs/catalog/c193.htm

答案 1 :(得分:0)

答案 2 :(得分:0)

你的建议几乎总能奏效。但对于某些用途,几乎总是'不够好。

如果你有延迟约束,$ res2上的提交可能会在违反约束时失败,然后回滚$ res为时已晚。

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

如果'几乎总是'不够好,你不能将一组数据迁移到另一个数据库中,然后你可能需要求助于准备好的事务"。