首页 > 解决方案 > 为什么没有在 MySQL 中锁定 READ COMMITTED

问题描述

我在我的 Windows 机器上使用 MySQL 8。试图查看 READ COMMITTED 隔离级别。

innodb_lock_wait_timeout = 5;
innodb_rollback_on_timeout =1;


T1:  start transaction;
     update todo set title='RC' where id=1;
     

T2;
    start transaction;
    set session transaction isolation level read committed;
    select title from todo where id=1;
    got output

根据我的理解,T1 对 id=1 有写锁,T2 不应该得到输出。T2 应该得到锁超时异常。

为什么 T2 没有获得锁定超时并获得提交的结果?

如何获得锁定超时?

标签: mysqlisolation-leveltransaction-isolation

解决方案


T2 正在运行非锁定SELECT 语句。它不需要等待 T1 持有的锁,因为 T2 可以读取在 T2 开始事务发生时提交的行版本。

如果您运行锁定SELECT 语句,则需要等待 T1 持有的锁。

SELECT title FROM todo WHERE id=1 FOR UPDATE;

无论您使用事务隔离级别 READ COMMITTED 还是 REPEATABLE READ,上述两种解释都是正确的。


推荐阅读