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

时间:2017-10-01 17:48:35

标签: 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

  

那不会蹲下来。交易在一个单独的内部被隔离   "数据库&#34 ;.为了让交易跨越多个   数据库,你需要被称为"分布式事务   管理"

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

1 个答案:

答案 0 :(得分:1)

您误解了与之关联的问题。

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

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

重新评论:

是的,事务的范围限定为单个连接,并且连接到单个MySQL Server实例。您不能进行跨多个MySQL连接的事务。

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

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

大多数应用程序不需要XA事务,因为它们一次只能处理一个MySQL实例。