mysql中锁主要分为乐观锁和悲观锁,乐观锁需要自己去实现通常都是加版本号。悲观锁在mysql中是有具体实现的,而且实现的种类比较多。
首先悲观锁可以分为行锁和表锁:
行锁分为共享锁(S)和排它锁(X)
排它锁则分为:
在RR隔离级别下:分为记录锁(record lock)、间隙锁(gap lock)、临健锁(记录锁+间隙锁)(next-key lock)
在RC隔离级别下:只有记录锁
表锁分为意向锁和自增锁
意向锁分为意向共享锁(IS)和意向排它锁(IX)
自增锁就是控制主键递增的
下面看一下在不同隔离级别下不同的sql语句加锁的情况只分析排它锁(select * from t for update)
RR隔离级别下:
1、无主键无唯一索引无普通索引:
表:意向排它锁(lock mode IX)
记录:临键锁+边界最大值锁(lock mode X + supremum)
结果:相当于锁全表
2、无主键无唯一索引有普通索引:
条件有索引:
表:意向排它锁(lock mode IX)
记录:
索引条件:临键锁+间隙锁(lock_mode X + lock_mode X locks gap before rec)
聚簇索引:记录锁(lock_mode X locks rec but not gap)
结果:当前条件上下两个索引范围(
例1:系统三条记录10,20,30 如果条件为=20 则会锁定[10,20)+[20]+(20,30))
例2:系统三条记录10,20,30 如果条件为=10 则会锁定[负无穷,10)+[10]+(10,20))
条件无索引:
表:意向排它锁(lock mode IX)
记录:临键锁+边界最大值锁(lock mode X + supremum)
结果:相当于锁全表
3、无主键有唯一索引无普通索引:
条件有索引:
表:意向排它锁(lock mode IX)
记录:记录锁(lock_mode X locks rec but not gap)
结果:只锁条件行
条件无索引:
表:意向排它锁(lock mode IX)
记录:临键锁+边界最大值锁(lock mode X + supremum)
结果:相当于锁全表
4、有主键无唯一索引无普通索引;
条件有索引:
表:意向排它锁(lock mode IX)
记录:记录锁(lock_mode X locks rec but not gap)
结果:锁定当前行
条件无索引:
表:意向排它锁(lock mode IX)
记录:临键锁+边界最大值锁(lock mode X + supremum)
结果:相当于锁全表
5、有主键无唯一索引有普通索引;
条件有索引:
普通索引条件:
表:意向排它锁(lock mode IX)
记录:
索引:临键锁+间隙锁(lock_mode X + lock_mode X locks gap before rec)
主键:当前记录对应的主键锁(lock_mode X locks rec but not gap )
结果:锁定记录上下区间+对应主键
主键条件:主键记录锁(lock_mode X locks rec but not gap)
混合条件:主键记录锁(lock_mode X locks rec but not gap)
条件无索引:
表:意向排它锁(lock mode IX)
记录:
普通索引:临键锁+边界最大值锁(lock mode X + supremum)
主键:所有主键记录锁(lock_mode X locks rec but not gap)
结果:相当于锁全表
6、有主键有唯一索引无普通索引:
条件有索引:
唯一索引:
表:意向排它锁(lock mode IX)
记录:
唯一索引:条件记录锁(lock_mode X locks rec but not gap)
主键:条件对应记录的主键锁(lock_mode X locks rec but not gap)
结果:条件对应的记录加锁,条件对应的主键加锁
主键索引:主键记录锁( lock_mode X locks rec but not gap)
条件无索引:
表:意向排它锁(lock mode IX)
记录:
唯一索引:临键锁+边界最大值锁(lock mode X + supremum)
主键:记录锁(lock_mode X locks rec but not gap)
结果:相当于锁全表
综上所述:在RR的隔离级别条件下:
1、如果查全表则是表锁。
2、如果带条件查询
条件为普通索引:临键锁+边界最大值锁(lock mode X + supremum)
条件为唯一索引:临键锁+边界最大值锁(lock mode X + supremum)
条件为主键:临键锁+边界最大值锁(lock mode X + supremum)
在RC隔离级别下,因为没有间隙锁所以锁退化为记录锁。
理解之上,写出想要说的话!
以上仅为个人拙见,写出来加深记忆,错误之处欢迎大神指正!



