多个数据库和事务

时间:2010-02-10 19:44:50

标签: 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();

3 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:1)

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

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