MySQL--共享锁和排他锁
一. 引言:
想象图书馆借书场景:当你在阅览区看书时,其他人也可以一起阅读(共享),但管理员整理书架时会在旁边立个"整理中"的牌子禁止他人进入(排他)。这正是共享锁(Shared Lock)和排他锁(Exclusive Lock)的核心思想。
二. 基础概念
三. 共享锁
共享锁适用于那些不会改变现有数据状态的操作,比如查询语句SELECT ... LOCK IN SHARE MODE
可以用来显式地请求获得一条或多条记录上的共享锁。这意味着在同一时间点上允许多个客户端同时持有相同的S锁并执行只读型的任务,从而提高了系统的并发处理能力。
四. 排他锁
相比之下,排他锁则更加严格——它不仅阻止其它X锁的存在同时也排斥所有的S锁。因此,只有当没有任何活动中的共享锁或其他形式更高级别的锁定存在于目标对象之上时,才能成功设置排他锁。这通常发生在UPDATE, DELETE这样的写入命令之前,通过语法如SELECT ... FOR UPDATE
实现对特定行加X锁的功能。
五. 应用场景分析
-
高并发读环境下的优化
对于主要以读为主的业务逻辑来说,利用好共享锁能够极大提升性能表现。因为在这种情况下,大多数时候只需要保证读者之间互不影响即可满足需求,所以尽可能多地采用S锁而非X锁会减少不必要的等待现象发生。
-
保护正在变更的数据项
当涉及到更新或者删除某些敏感信息的时候,应该优先考虑使用排他锁。这样做可以在一定程度上避免脏读、不可重复读等问题的发生,进而保障交易过程的安全可靠。
-- 获取共享锁的例子
START TRANSACTION; SELECT * FROM table_name WHERE id = 10 LOCK IN SHARE MODE;
-- 获取排他锁的例子
START TRANSACTION; SELECT * FROM table_name WHERE id = 10 FOR UPDATE;