行锁

107 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

行锁

MySQL的行锁又分为共享锁(S锁)和排他锁(X锁)。

一般普通的select语句,InnoDB不加任何锁,我们称之为快照读。

select * from test;

通过S锁和X锁的select语句或者插入/更新/删除操作,我们称之为当前读。

select * from test lock in share mode;

select * from test for update;

insert into test values(….);

update test set ….;

delete from test…;

共享锁:又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同

一数据可以共享同一把锁,都能访问到数据,但是只能读不能修改。

排他锁:又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他锁共

存,如果一个事务获取了一个数据行的排他锁,其他事务旧不能再获取该行的其他锁了,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。

行锁基于索引实现的,所以一旦某个加锁操作没有使用索引,那么该锁就会退化为表锁。

从对数据操作的粒度分法

表级锁:表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加

锁(MyISAM引擎默认表级锁,也只支持表级锁)。比如说更新一张10万表数据中的一条数据,在这条update没提交事务之前,其它事务是会被排斥掉的,粒度很大。

行级锁:行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁(基

于索引实现的,所以一旦某个加锁操作没有使用索引,那么该锁就会退化为表锁)

页级锁:页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁,一次锁定相邻一

组记录

行锁的实现:

InnoDB行锁是通过给索引上的索引项加锁,这一点MySQL与Oracle不同,后者是通过在数

据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着:只通过索引条件检索数据,InnoDB才使用才使用行锁,否则,InnoDB将使用表锁。

在实际应用中,要特别注意InnoDB行锁的这一特征,不然的话,可能导致大量锁冲突,从而影响并发性能。