【问题标题】:Confused about transactions within multiple databases对多个数据库中的事务感到困惑
【发布时间】:2018-03-12 21:55:39
【问题描述】:

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

那不会做深蹲。事务被隔离在一个单一的 “数据库”。为了让交易跨越多个 数据库,你需要所谓的“分布式事务 管理”。

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

【问题讨论】:

    标签: php mysql database pdo transactions


    【解决方案1】:

    您误解了您所链接的问题。

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

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


    你的评论:

    是的,一个事务的作用域是单个连接,一个连接是单个 MySQL 服务器实例。您不能进行跨越多个 MySQL 连接的事务。

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

    MySQL 支持跨多个服务器的分布式事务的概念。它被称为XA Transaction。 PDO 对 XA 事务没有任何直接支持。

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

    【讨论】:

    • 请参阅编辑。我发现的另一个问题的措辞是“事务在单个数据库中被隔离”。将事务隔离在单个数据库连接和服务器中是否更正确?
    • 这对于其他 DBM 来说是常见的,还是只适用于 mysql?
    • 我没有验证所有其他 DBMS,但根据我的经验,这很常见。
    猜你喜欢
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    相关资源
    最近更新 更多