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 默认数据库,因此您不必在每个查询中指定数据库名称。
关于是否允许在 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 默认数据库,因此您不必在每个查询中指定数据库名称。