暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

QA:RR/RC 锁持有相关问题

00后DBA实录 2025-08-25
238


  1. Q:RR/RC 在锁持有方面的区别

    A:transaction 期间获取的每个 lock 都会在 transaction 持续期间保留/与扫描不匹配的 locks 将在评估 record 不匹配时释放

  2. Q:RC 隔离级别单独执行类似以下的 SQL 会不会锁住全表,什么时候会锁住全表

    update t1 set name='xx' where info <> 'N' 

    A:关键在是否使用索引。如果评估 Where 条件阶段没有使用索引会全表扫描并锁住扫描到的所有 record,并在评估结束后释放,这个时候锁的是被扫描到的索引记录(通常是聚簇索引/主键)。如果在评估 Where 条件阶段使用了索引则依旧会在评估 Where 条件阶段锁住扫描的 record,只是相对于全表扫描,走索引评估会更快

  3. Q:什么是半一致性读

    A:用于 UPDATE
     语句的一种读取操作,它是 READ COMMITTED 和 consistent read 的组合。当 UPDATE
     语句检查已锁定的行时,InnoDB
     会将最新提交的版本返回给 MySQL,以便 MySQL 可以确定该行是否符合 UPDATE
     的 WHERE
     条件。如果该行匹配(必须更新),MySQL 将再次读取该行,此时 InnoDB 要么锁定它,要么等待对它的锁定。只有当事务具有 READ COMMITTED isolation level 时,才会发生这种类型的读取操作。

  4. Q:半一致性读只有  UPDATE
     语句才有吗

    A:是的

  5. Q:半一致性读会不会锁全表

    A:没有走索引评估会锁全表与前面讲的机制一致,只是在遇到已经被锁的 record 时会根据 commit view 判断一下,而不是立即阻塞

  6. Q:怎么解决锁全表的情况

    A:对相应 DELETE/UPDATE 语句的 WHERE 条件添加索引


文章转载自00后DBA实录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论