云计算、AI、云原生、大数据等一站式技术学习平台

网站首页 > 教程文章 正文

MySQL InnoDB的行锁模式及加锁方法

jxf315 2025-07-01 20:49:09 教程文章 2 ℃

InnoDB实现了以下两种类型的行锁。

共享锁(S): 允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。

排他锁 (X): 允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。

另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB 还有两种内部使用的意向锁(Intention Locks ),这两种意向锁都是表锁。

意向共享锁 (IS): 事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的 IS 锁。

意向排他锁 (IX): 事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的 IX 锁。

当前锁模式

X

IX

S

IS

X

冲突

冲突

冲突

冲突

IX

冲突

兼容

冲突

兼容

S

冲突

冲突

兼容

兼容

IS

冲突

兼容

兼容

兼容

如果一个事务请求的锁模式与当前的锁兼容,InnoDB 就将请求的锁授予该事务;反之,如果两者不兼容,该事务就要等待锁释放。

意向锁是InnoDB 自动加的,不需用户干预。对于UPDATE、DELETE 和INSERT语句InnoDB 会自动给涉及数据集加排他锁(X);对于普通 SELECT 语句,InnoDB 不会加任何锁;事务可以通过以下语句显示给记录集加共享锁或排他锁:

共享锁(S): SELECT * FROM lable name WHERE... LOCK IN SHARE MODE

排他锁(X): SELECT*FROM table name WHERE..FOR UPDATE

用SELECT...IN SHARE MODE获得共享锁,主要用在需要数据依存关系时来确认某行记录是否存在,并确保没有人对这个记录进行UPDATE或者 DELETE操作。但是如果当前事务也需要对该记录进行更新操作,则很有可能造成死锁,对于锁定行记录后需要进行更新操作的应用,应该使用 SELECT..FOR UPDATE 方式获得排他锁。

最近发表
标签列表