行锁,顾名思义就是根据条件只锁定表数据中的其中一行数据或几行数据。由于锁的粒度是到行,粒度比表锁小,所以可以更好的减少锁冲突的发生。
在MySQL中,行锁是在引擎层由各个引擎自己实现的。MyISAM引擎不支持行锁,InnoDB支持行锁。
在InnoDB中,行锁有如下几个知识点:
1、超时参数配置
innodb_lock_wait_timeout 默认是50s
2、行锁是通过给索引增加锁来实现的
InnoDB的行锁只有在通过索引条件检索数据时才能使用,否则会升级为表锁。
也就是说,想要使用行级锁,就一定要给使用的where条件加索引,一般来说都是直接使用主键索引。
3、行锁的加锁方式是自动加锁
对于UPDATE、DELETE、INSERT操作,InnoDB会自动给涉及的数据集添加排他锁。
对于SELECT操作,InnoDB不会添加任何锁。
4、行锁的上锁和释放时机
在InnoDB事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。
所以在开发中可以把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。