【问题标题】:Why no lock in MySQL for READ COMMITTED为什么没有在 MySQL 中锁定 READ COMMITTED
【发布时间】:2021-02-02 20:40:27
【问题描述】:

我在我的 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 没有获得锁定超时和提交结果?

如何获得锁超时?

【问题讨论】:

    标签: mysql isolation-level transaction-isolation


    【解决方案1】:

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

    如果你运行一个 locking SELECT 语句,它需要等待 T1 持有的锁。

    SELECT title FROM todo WHERE id=1 FOR UPDATE;
    

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

    【讨论】:

    • 感谢您的澄清。但是其他数据库(例如 MsSQL)不期望更新语法,它适用于正常选择。如果我选择不更新并准备报告会发生什么。它会显示错误的报告。为避免这种情况,我是否需要在所有查询中添加更新?
    • 使用 REPEATABLE READ 和非锁定 SELECT 查询对报告来说更好。它允许您在一个事务中运行多个 SELECT 语句,并确保所有 SELECT 语句都基于相同的数据,及时查看快照。它这样做没有锁定。
    猜你喜欢
    • 2014-09-18
    • 2012-07-04
    • 2021-01-30
    • 2014-02-28
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多