我无法找到一个明确的答案,它是否允许在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语句,但是对于我来说,如果使用多个数据库服务器,多个连接时,它并不是很清楚或者只是在执行上面的代码时一般。
答案 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
语句选择默认数据库,因此您不必在每个查询中指定数据库名称。