MySQL 数据库行级锁的那些事儿!记录锁、间隙锁、临键锁和加锁规则

如题所述

在本篇内容中,我们将探讨 MySQL 数据库行级锁的特性,特别是记录锁、间隙锁、临键锁以及它们的加锁规则。文章以 MySQL 版本 5.7.25 和隔离级别为可重复读为测试基础,通过实例测试和验证加锁范围。

首先,我们介绍行级锁的基本概念。行级锁包括记录锁、间隙锁和临键锁。记录锁锁定单行记录,防止被修改。间隙锁锁定记录之间的空隙,防止插入新记录。临键锁则同时包括间隙锁和记录锁,锁定范围为左开右闭区间。

接下来,我们将通过七条语句示例来展示不同查询条件下的加锁范围。例如,使用唯一索引查询时,如果未找到值,将对值所在间隙加间隙锁;如果找到值,则仅加记录锁。而非唯一索引查询时,如果未找到值,同样对间隙加锁;若找到值,需要额外加记录锁。

针对索引进行范围查询时,加锁范围为左开右闭区间,并遵循>或≥与<或≤的规则。在进行范围查询逆序排序时,加锁顺序与正序一致,但可能对左边界加多余锁。

当使用索引字段和非索引字段查询时,仅对有索引字段的行或其周围间隙加锁,非索引字段仅用于过滤。删除锁的边界值将扩大间隙锁范围,修改边界值则不能缩小范围。

索引查询并使用 limit 时,锁范围缩小,仅加至满足条件的最后一条记录。而覆盖索引使用 lock in share mode 仅锁定非唯一索引字段。对于非唯一索引的范围查询和加锁,最后访问的记录通常不会对主键加锁。

总结而言,MySQL 行级锁遵循一系列规则来确定加锁范围。理解这些规则有助于优化查询性能和避免死锁情况。通过测试和验证,我们可以更加精确地掌握这些加锁机制。本文内容主要参考《MySQL实战45讲》,欢迎进一步探索和实践。
温馨提示:答案为网友推荐,仅供参考
相似回答
大家正在搜