跨数据库的MySQL PHP事务

时间:2016-02-24 21:48:59

标签: php mysql transactions

我无法找到一个明确的答案,它是否允许在PHP中进行交易跨越多个数据库。

我使用相同的连接对象(mysqli)并以这种方式执行事务:

$mysqli->autocommit(false);

try {

    // Assume here that some code would throw an exception

    $stmt = $mysqli->prepare("INSERT INTO db1.x (column) VALUES (y)");
    $stmt->execute();
    $stmt->close();

    $stmt = $mysqli->prepare("INSERT INTO db2.x (column) VALUES (y)");
    $stmt->execute();
    $stmt->close();

    $mysqli->commit();
    // Great success

} catch (Exception $e) {

    $mysqli->rollback();
    throw $e; // handle elsewhere

}

这是允许的吗?它会正确提交并回滚吗?根据手册(http://dev.mysql.com/doc/refman/5.6/en/xa.html)和SO上的其他线程,似乎我需要使用XA语句,但是对于我来说,如果使用多个数据库服务器,多个连接时,它并不是很清楚或者只是在执行上面的代码时一般。

2 个答案:

答案 0 :(得分:3)

根据上述评论请求,省略创建/使用反馈:

mysql> create database x;
mysql> use x;
mysql> create table x (x int);
mysql> create database y;
mysql> use y;
mysql> create table y (y int);
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into x.x values (1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into y.y values (1);
Query OK, 1 row affected (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from x.x;
Empty set (0.00 sec)

mysql> select * from y.y;
Empty set (0.00 sec)

请注意,这只是单个连接上的一个mysql实例。如果dbs托管在不同的服务器上,或者你在不同的连接上创建/插入它们,它将无法工作。

答案 1 :(得分:2)

事务作为一个整体适用于服务器。数据库仅用于对表进行分组以授予权限(例如,您可以向database.*授予权限)并在创建新表时提供一些默认值。并且他们习惯于使用USE语句选择默认数据库,因此您不必在每个查询中指定数据库名称。