开启掘金成长之旅!这是我参与「掘金日新计划 · 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行锁的这一特征,不然的话,可能导致大量锁冲突,从而影响并发性能。