多个数据库和事务

4 mysql transactions

如果我使用两个数据库,我必须开始交易?这是正确的,还是这段代码错了?如果我在第二个查询中出错,那么调用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();
Run Code Online (Sandbox Code Playgroud)

lon*_*eck 15

mysql支持XA事务,它允许像robert建议的两步提交,但是以更正式的方式.PHP接口不直接支持XA事务,因此您必须自己发送事务命令作为语句.

  • 这应该是公认的答案! (5认同)

Rob*_*Mah 6

那不会蹲下来.事务在单个"数据库"中被隔离.为了使事务跨越多个数据库,您需要所谓的"分布式事务管理".这样做的标准包括XTA.更多面向企业的框架(包括Java J2EE)将此类内容作为标准包含在内.

既然你看起来像是在使用PHP,那么你就必须自己动手,可以这么说.我假设Mysql支持嵌套事务(我不知道).所以,如果两个db上的内部事务都成功,那么你很好......提交两个外部事务.如果任一内部事务失败,则回滚两个外部事务.


Mar*_*rkR 6

您真正应该做的是,使用单个数据库连接来使用两个数据库。

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