我在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事务,有可能吗?,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上的insert显然失败了,但是db1.test也没有提交。
我很困惑。当我清楚地使用两个数据库时,为什么PDO要执行一个事务?
另外,这个问题的答案是:多个数据库和事务
不会蹲下的。事务是在单个“数据库”中隔离的。为了使事务跨越多个数据库,您需要所谓的“分布式事务管理”。
尽管有关此问题的代码使用两个连接。
发布于 2017-10-01 18:28:57
你误解了你与之相关的问题。
当然,您可以在多个数据库中引用表的事务,只要数据库驻留在MySQL服务器的同一个实例中。您甚至可以使用限定表名在一条语句中引用多个数据库。
链接到的问题是关于在不同主机上托管在不同MySQL服务器实例中的数据库。PDO不支持协调针对多个MySQL服务器的提交。
关于你的评论:
是的,事务的作用域为单个连接,连接到单个MySQL服务器实例。不能进行跨多个MySQL连接的事务。
但是,在一个连接到一个MySQL服务器实例中,您可以引用多个数据库。
MySQL支持跨多个服务器的分布式事务的概念。这叫XA事务。PDO对XA事务没有任何直接支持。
大多数应用程序不需要XA事务,因为它们一次只处理一个MySQL实例。
https://stackoverflow.com/questions/46515163
复制相似问题