
Q:RR/RC 在锁持有方面的区别
A:transaction 期间获取的每个 lock 都会在 transaction 持续期间保留/与扫描不匹配的 locks 将在评估 record 不匹配时释放
Q:RC 隔离级别单独执行类似以下的 SQL 会不会锁住全表,什么时候会锁住全表
update t1 set name='xx' where info <> 'N'A:关键在是否使用索引。如果评估 Where 条件阶段没有使用索引会全表扫描并锁住扫描到的所有 record,并在评估结束后释放,这个时候锁的是被扫描到的索引记录(通常是聚簇索引/主键)。如果在评估 Where 条件阶段使用了索引则依旧会在评估 Where 条件阶段锁住扫描的 record,只是相对于全表扫描,走索引评估会更快
Q:什么是半一致性读
A:用于
UPDATE
语句的一种读取操作,它是 READ COMMITTED 和 consistent read 的组合。当UPDATE
语句检查已锁定的行时,InnoDB
会将最新提交的版本返回给 MySQL,以便 MySQL 可以确定该行是否符合UPDATE
的WHERE
条件。如果该行匹配(必须更新),MySQL 将再次读取该行,此时 InnoDB 要么锁定它,要么等待对它的锁定。只有当事务具有 READ COMMITTED isolation level 时,才会发生这种类型的读取操作。Q:半一致性读只有
UPDATE
语句才有吗A:是的
Q:半一致性读会不会锁全表
A:没有走索引评估会锁全表与前面讲的机制一致,只是在遇到已经被锁的 record 时会根据 commit view 判断一下,而不是立即阻塞
Q:怎么解决锁全表的情况
A:对相应 DELETE/UPDATE 语句的 WHERE 条件添加索引
文章转载自00后DBA实录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




