首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对多个数据库中的事务感到困惑

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

Stack Overflow用户
提问于 2017-10-01 17:48:34
回答 1查看 752关注 0票数 1

我在mysql上创建了两个数据库,每个数据库都包含一个名为"test“的表。

代码语言:javascript
复制
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事务,有可能吗?,PDO不支持多个数据库中的事务,但我对测试结果感到惊讶。这是我的密码。

代码语言:javascript
复制
$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上的insert显然失败了,但是db1.test也没有提交。

我很困惑。当我清楚地使用两个数据库时,为什么PDO要执行一个事务?

另外,这个问题的答案是:多个数据库和事务

不会蹲下的。事务是在单个“数据库”中隔离的。为了使事务跨越多个数据库,您需要所谓的“分布式事务管理”。

尽管有关此问题的代码使用两个连接。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-01 18:28:57

你误解了你与之相关的问题。

当然,您可以在多个数据库中引用表的事务,只要数据库驻留在MySQL服务器的同一个实例中。您甚至可以使用限定表名在一条语句中引用多个数据库。

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

关于你的评论:

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

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

MySQL支持跨多个服务器的分布式事务的概念。这叫XA事务。PDO对XA事务没有任何直接支持。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46515163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档