MySQL PHP 跨数据库事务

MySQL PHP Transaction across databases

关于是否允许在 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 语句,但(对我而言)如果这是在使用多个数据库服务器、多个连接或只是一般情况下,还不是很清楚当执行上面的代码时。

根据上述评论请求,省略 create/use 反馈:

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 实例。如果数据库托管在不同的服务器上,或者您在不同的连接上执行每个 create/insert,它将不起作用。

交易适用于整个服务器。数据库仅用于为了授予权限(例如,您可以授予 database.* 权限)和在创建新表时提供一些默认值而对表进行分组。它们用于允许您使用 USE 语句 select 默认数据库,因此您不必在每个查询中指定数据库名称。