- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 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/
我正在尝试学习Rust。我正在阅读一本书online,该书实现了unix程序cat。现在,我试图读取作为像cargo run file1.txt file2.txt这样的参数传递的文件的内容,但是程序
我在 GHC 8.0.1 中遇到了一个带有种类索引 (?) GADT 的奇怪情况,其中在类型与种类签名中引入 foralls 会产生不同的类型检查行为。 考虑以下数据类型: {-# LANGUAGE
我正在使用 Perl 5.10 开发应用程序,HTML::Mason和 Apache 2.2。这是我第一次在大型项目中使用 Perl 5.10。我每隔一段时间就会出现奇怪的行为。应用程序因一个非常奇怪
我正在尝试将文件上传到aws中的rust中,因为我使用的是 rusoto_s3 的s3 rust客户端,当这些部分从单个线程发送时,我设法使分段上传代码正常工作不是我想要的,我想上传大文件,并且希望能
我是一名优秀的程序员,十分优秀!