gpt4 book ai didi

php - 对多个数据库中的事务感到困惑

转载 作者:搜寻专家 更新时间:2023-10-30 23:33:02 24 4
gpt4 key购买 nike

我在 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

That won't do squat. Transactions are isolated within a single "database". In order to have transactions span across multiple databases, you need what's called "distributed transaction management".

虽然这道题的代码使用了两个连接。

最佳答案

您误解了链接到的问题。

您当然可以执行引用多个数据库中的表的事务,只要这些数据库托管在同一个 MySQL 服务器实例中即可。通过使用 qualified table names,您甚至可以在一条语句中引用多个数据库。 .

您链接到的问题是关于在不同主机上的不同 MySQL 服务器实例中托管的数据库。 PDO 不支持协调针对多个 MySQL 服务器的提交。


回复你的评论:

是的,一个事务的范围是一个单一的连接,一个连接是建立在一个单一的 MySQL 服务器实例上的。您不能进行跨越多个 MySQL 连接的事务。

但是在与一个 MySQL 服务器实例的一个连接中,您可以引用多个数据库。

MySQL 支持跨多个服务器的分布式事务的概念。它叫做 XA Transaction . PDO 不直接支持 XA 事务。

大多数应用程序不需要 XA 事务,因为它们一次只在一个 MySQL 实例上工作。

关于php - 对多个数据库中的事务感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46515163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com