gpt4 book ai didi

php - Mysql 事务未按预期工作

转载 作者:行者123 更新时间:2023-11-29 01:59:17 27 4
gpt4 key购买 nike

我已经阅读了很多关于 mysql 和事务的文档,据我了解,当我在 MySQL InnoDB 中使用可重复读取隔离级别并启动事务并添加一些行时,当我对这些行进行选择时MySQL 在该事务中看不到它们的行。例如:

function dotransaction() {
$result = mysqli_query("START TRANSACTION");
if (!$result) return false;

$result = mysqli_query("INSERT INTO t (f1,f2) VALUES (1,2)");
if (!$result) {
mysqli_query("ROLLBACK");
return false;
}

$result = mysqli_query("INSERT INTO t (f1,f2) VALUES (3,4)");
if (!$result) {
mysqli_query("ROLLBACK");
return false;
}

$result = mysqli_query("UPDATE t2 SET f3=(SELECT COUNT(*) AS count FROM t WHERE f1=1) WHERE f4=2");
if (!$result) {
mysqli_query("ROLLBACK");
return false;
}
}

如果我在 PHP 中执行以下代码,它实际上会将表 t2 中的字段 f3 更新为 1。但我没想到会这样,因为当我启动事务时,事务会从数据库中读取快照,无论我在哪里使用 select 语句,它都会使用第一个读取的快照,而不是对表的修改。当我从 UPDATE 语句中取出 select 语句时,它也会遇到 count=1。

最佳答案

你理解错了。

在事务中对数据所做的更改在该事务中是可见的,因此您的 SELECT 语句将看到更新的行。

然而,这些更改在事务之外是不可见的,因此如果另一个用户同时连接到服务器并查询这些行,他将看到它们处于未更改的状态。

关于php - Mysql 事务未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19268298/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com