多个数据库和事务

6
如果我使用两个数据库,我必须启动事务吗?这是正确的吗,还是代码有问题?如果我在第二个查询中犯了一个错误,然后调用rollback(),但不幸的是无法回滚第一个查询...
 $conn_site=mysql_connect("localhost", "us", "ps");
 mysql_select_db("site",$conn_site); 
 $conn_forum=mysql_connect("localhost", "us", "ps");
 mysql_select_db("forum",$conn_forum); 

     function begin() {

         @mysql_query("BEGIN",$conn_site);
         @mysql_query("BEGIN",$conn_forum);
     }
    function commit_reg() {
        @mysql_query("COMMIT",$conn_site);
        @mysql_query("COMMIT",$conn_forum);
    }
    function rollback(){
        @mysql_query("ROLLBACK",$conn_site);
        @mysql_query("ROLLBACK",$conn_forum);
    }
   begin();
    mysql_query("insert into users (....) or rollback();
       mysql_query("insert into forumusers (....) or rollback();
    commit();
3个回答

18

MySQL 支持 XA 事务,它允许像 Robert 建议的两阶段提交,但以更正式的方式进行。PHP 接口不直接支持 XA 事务,因此您需要自己将事务命令作为语句发送。


9

那行不通。交易在单个“数据库”内隔离。为了使交易跨越多个数据库,您需要所谓的“分布式事务管理”。执行此操作的标准包括XTA。更面向企业的框架,包括Java J2EE,将其作为标准功能。

由于看起来您正在使用PHP,您需要自己编写代码。我假设Mysql支持嵌套事务(我不确定)。因此,如果两个数据库上的内部事务都成功,则可以提交两个外部事务。如果任一内部事务失败,则回滚两个外部事务。


Mysql不支持嵌套事务。https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html - Peter Chaula

6

您真正需要做的是,使用单个数据库连接来同时使用两个数据库。

在MySQL中,“数据库”实际上更像是其他服务器中的“目录”或“模式”。只要权限允许,您可以在同一个连接中使用另一个数据库中的表。


你能提供伪代码或更详细的示例吗?这似乎适合我的用例,但不确定如何实现... - frederj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接