MySQL知识点之InnoDB中的行级锁

文 / @UTHEME

MySQL知识点之InnoDB中的行级锁

MySQL中的行锁,也称为记录锁,是通过给索引上的索引项加锁来实现的。在InnoDB中,只有当通过索引条件检索数据时,才会使用行级锁,否则将使用表锁。不论是使用主键索引、唯一索引或普通索引,InnoDB都会使用行锁来对数据加锁。但是即使是行锁,InnoDB里也是分成了各种类型的。

其中最常用的行锁类型是RecordLocks,也叫做记录锁。它仅仅把一条记录锁上,官方的类型名称为LOCK_REC_NOT_GAP。记录锁是有S锁和X锁之分的。当一个事务获取了一条记录的S型记录锁后,其他事务也可以继续获取该记录的S型记录锁,但不可以继续获取X型记录锁。当一个事务获取了一条记录的X型记录锁后,其他事务既不可以继续获取该记录的S型记录锁,也不可以继续获取X型记录锁。

除了记录锁之外,在InnoDB中还有GapLocks这种类型的锁。它实质上是对索引前后的间隙上锁,而不是对索引本身上锁。在一些特定的情况下,使用 GapLocks 可以解决 InnoDB 的幻读问题。但是需要注意的是,GapLocks 也可能引起死锁。当事务在第一次执行读取操作时,那些幻影记录尚不存在,我们无法给这些幻影记录加上记录锁。而 GapLocks 则可以对索引前后的间隙进行上锁,以避免幻读。

在使用行锁时,需要注意的是,不同的类型的行锁起到的功效是不同的。因此,在使用行锁时,需要根据具体的情况选择合适的锁类型,防止出现问题。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。