我在mysql上创建了两个数据库,每个数据库都包含一个名为" test"的表。
create table db1.test(
test_id int primary key auto_increment,
value int(5) not null);
create table db2.test(
test_id int primary key auto_increment,
value int(5) not null);
根据PDO transaction across multiple databases, is it possible?,PDO不支持多个数据库中的事务,但我对测试结果感到惊讶。这是我的代码。
$con = new PDO("mysql:host=localhost", "root", "", array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
try {
$con->beginTransaction();
$con->exec("use db1");
$stmt = $con->prepare("insert into test (value) values(?)");
$stmt->execute([1]);
$con->exec("use db2");
$stmt = $con->prepare("insert into test (value) values(?)");
$stmt->execute([1]);
$con->commit();
} catch (Exception $e) {
$con->rollback();
echo $e->getMessage();
}
代码成功插入没有问题。为了测试我启动的事务因为我使用两个数据库而无法工作,我已经删除了db2.test并期望db1.test上的插入仍然成功。 db2.test上的插入显然失败了,但db1.test也没有提交。
我很困惑。当我明显使用两个数据库时,为什么PDO会执行事务?
此外,这个问题的答案: Multiple database and transactions
那不会蹲下来。交易在一个单独的内部被隔离 "数据库&#34 ;.为了让交易跨越多个 数据库,你需要被称为"分布式事务 管理"
虽然这个问题的代码使用了两个连接。
答案 0 :(得分:1)
您误解了与之关联的问题。
只要数据库托管在同一MySQL服务器实例中,您当然可以执行引用多个数据库中的表的事务。您甚至可以使用qualified table names在单个语句中引用多个数据库。
您链接的问题是在不同主机上的不同 MySQL服务器实例中托管的数据库。 PDO不支持协调针对多个MySQL服务器的提交。
重新评论:
是的,事务的范围限定为单个连接,并且连接到单个MySQL Server实例。您不能进行跨多个MySQL连接的事务。
但在与一个MySQL Server实例的一个连接中,您可以引用多个数据库。
MySQL支持跨越多个服务器的分布式事务的概念。它被称为XA Transaction。 PDO对XA交易没有任何直接支持。
大多数应用程序不需要XA事务,因为它们一次只能处理一个MySQL实例。