行级锁每次操作均会锁定对应的行数据,锁定粒度最小,致使锁冲突发生的可能性最低,因而并发度最高。它被应用于 InnoDB 存储引擎之中,要知道,InnoDB 的数据是依据索引来组织的,行锁通过对索引上的索引项加锁来实现,并非针对记录加锁。
同时,InnoDB 行锁包含共享锁(S)和排他锁(X) ,而行锁的共享锁和排他锁还能够继续细分成为三类:记录锁、间隙锁与临键锁。
WHERE id = 1
)并且查询的索引是唯一索引时,会对匹配的行加记录锁。students
,其中 id
是主键,事务 A 执行 SELECT * FROM students WHERE id = 15 FOR UPDATE;
,此时就会对 id = 15
的这行数据加记录锁。WHERE id > 5
),如果查询的索引不是唯一索引,会使用间隙锁。SELECT * FROM students WHERE age > 20 FOR UPDATE;
,假设 age
列上没有唯一索引,此时会对 age
值大于 20 的间隙加间隙锁。SELECT \* FROM students WHERE id >= 20 FOR UPDATE;
,如果 id
是唯一索引,会对 id >= 20
的范围加临键锁。InnoDB的行锁包含共享锁(S)和排他锁(X),在实现方式上表现为记录锁、间隙锁、临键锁。
共享锁(S 锁):允许其他事务同时读取被锁定的数据,但不允许修改。
排他锁(X 锁):则具有排他性,不允许其他事务获取共享锁或排他锁来访问被锁定的数据。
锁类型 | 共享锁(S 锁) | 排他锁(X 锁) |
---|---|---|
共享锁(S 锁) | 兼容(✔) | 冲突(×) |
共享锁(S 锁) | 兼容(✔) | 冲突(×)
| SQL | 行锁类型 | 加锁情况 |
| --- | --- | --- |
| SELECT | 无锁 | 没有任何加锁 |
| SELECT ... LOCK IN SHARE MODE | 共享锁(S 锁) | 需要在SELECT 查询末尾加上‘LOCK IN SHARE MODE’ |
| SELECT ... FOR UPDATE | 排他锁(X 锁) | 需要在SELECT 查询末尾加上‘FOR UPDATE’ |
| INSERT | 排他锁(X 锁) | 自动会加上排他锁 |
| UPDATE | 排他锁(X 锁) | 自动会加上排他锁 |
| DELETE | 排他锁(X 锁) | 自动会加上排他锁 |
总之,InnoDB 丰富多样的行锁机制,从共享锁与排他锁的大分类,到记录锁、间隙锁和临键锁的具体形式,为数据库的事务处理和并发操作提供了精细且可靠的控制手段。熟悉并驾驭这些行锁,是实现高性能、稳定可靠的数据库系统的重要基石。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。