【问题标题】:Two transactions on two databases两个数据库上的两个事务
【发布时间】:2014-06-07 20:37:30
【问题描述】:

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

问题 是否可以同时进行两个事务,将一些值插入数据库,然后Commit 或rollback 两者都进行?

守则

$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
}

总结 那么它是正确的方法,还是会起作用?

感谢所有提示。

【问题讨论】:

    标签: php postgresql transactions try-catch


    【解决方案1】:

    理论上

    如果你要删除

    或 wyjatek('rollback')

    你的脚本会起作用的。

    但要看文档

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

    对 XA transactions 的支持可用于 InnoDB 存储 引擎。

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

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

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

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案3】:

        您的建议几乎总是有效的。但对于某些用途,“几乎总是”还不够好。

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

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

        如果“几乎总是”不够好,并且您无法将一组数据迁移到另一个数据库中,那么您可能需要求助于“准备好的事务”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-29
          • 2012-03-17
          • 2021-06-20
          • 1970-01-01
          • 2018-04-19
          • 2014-03-12
          相关资源
          最近更新 更多