1. 锁类别
Innodb引擎支持锁的,MyISAM是不支持的,这里将的mysql锁就是Innodb的锁。Innodb支持行级锁,也就是锁定范围能够到达某个数据表的某行,锁的粒度还是很大的。
锁粒度大的好处是,能提高并发的性能,并发一定是需要锁的,如果是表级锁,那么一个事务锁定表,其它事务将阻塞等待,这样大大降低性能,其实获得锁的那个事务可能只操作某一行,却锁住整个表。
- 共享锁 : SLOCK
- 排它锁:XLOCK
2. 行级锁实现算法
- 记录锁: record lock 锁定某一条记录
- 间隙锁: Gap Lock 锁定一个范围
- 记录+间隙锁: Next-Key Lock
3. 为什么需要间隙锁
记录锁的性能其实不错了,那为什么需要间隙锁呢?
因为记录锁可能会出现幻读的情况,这个理解还是很容易的。
间隙锁锁住的不光是这一个记录,而是一个范围的数据,再满足范围类,是不允许其他事物进行数据处理的,这样在该事务操作期间,不会出现其他事物插入符合条件的数据,导致出现幻读的可能。
举个例子:[1,2,3,4]
事务1: 查询>2的数据
事务2: 插入5
使用记录锁,事务1锁住了记录2,这样事务2还是可以插入数据,这样事务1第二次查询的数据是3,4,5出现了幻读
使用间隙锁,锁住的是(2, 正无穷) ,这不一定是正无穷。 这样事务2在事务1执行期间内是不能插入的,这样就避免了幻读的可能。