在MySQL中为什么在使用read uncommitted时从select中设置变量获取锁?

Yos*_*eph 8 mysql locking transaction-isolation read-uncommitted

我们在MySQL中使用InnoDB有一个表,我们使用的是事务隔离级别read uncommitted.为什么设置@x如图所示获得锁定?

mysql> set @x = (select userID from users limit 1);
Query OK, 0 rows affected (0.02 sec)

mysql>
Run Code Online (Sandbox Code Playgroud)

尝试从另一个提示更新此表会导致超时错误:

mysql> update users set userID = 1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
Run Code Online (Sandbox Code Playgroud)

Ran*_*eed 0

您的第一个语句在表上执行 SELECT,因此事务获取一行上的读锁。

第二个事务尝试获取同一个表上的写锁(在所有行上,因为没有WHERE子句),但不能。

您需要在 后发出COMMIT(或) 命令,以便释放读锁。ROLLBACKSET @x = (...)

上面的说法是错误的。我保留这篇文章只是因为下面的评论可能会引起兴趣。

  • 我对此做了一些测试,这似乎是 DML 语句中子选择的普遍问题。`update foo set some_value = 'bar' where id in (select id from users)` 也会阻止写入 `users`(!) 表,即使根本没有更新。 (2认同)