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