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

标签 php mysql database pdo transactions

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

相关文章:

php - 更改了 phpMyAdmin 的根密码,现在我无法访问任何 MAMP

php - 创建在线 Web 界面以 dB 为单位存储消息并提供给最终用户,使用 PHP/MYSQL?

mysql - 如果在 mysql 中找不到匹配项,选择字段中的 count() 总是返回一行

mysql - 如何根据两个条件从 Ruby Sequel 表中删除行

php - 将数据插入数据库不起作用(PHP-SQL)

php - 复制并粘贴的域名已添加到末尾

php - 从现有 PHP 网站创建 iPhone 应用程序有哪些选项?

c# - 您无法添加或更改记录,因为表 'sales' 中需要相关记录

mysql - 我怎样才能让一个mysql主键即使在被删除后也永远不会重复

java - Microsoft SQL Server 与 Java 的日期问题