我已经阅读了很多关于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 count = 1。
答案 0 :(得分:3)
你理解错了。
在事务中对数据所做的更改在该事务中是可见的,因此SELECT语句将看到更新的行。
然而,这些更改在事务之外是不可见的,因此如果另一个用户同时连接到服务器并查询这些行,他将看到它们处于未更改状态。