为了方便以后复习和详细讲解,先把遇到的各种锁做个简单的记录和描述
话不多说先上图
我们听说过读锁、写锁、共享锁、互斥锁、行锁等等各种名词,简单对这些锁进行了分类
加锁机制:
1、乐观锁:先修改,保存时判断是够被更新过,应用级别
2、悲观锁:先获取锁,再操作修改,数据库级别
锁粒度:
表级锁:开销小,加锁快,粒度大,锁冲突概率大,并发度低,适用于读多写少的情况。
页级锁:BDB存储引擎
行级锁:Innodb存储引擎,默认选项
兼容性:
S锁,也叫做读锁、共享锁,对应于我们常用的 select * from users where id =1 lock in share mode
X锁,也叫做写锁、排它锁、独占锁、互斥锁,对应对于select * from users where id =1 for update
意向锁( Intention Locks ):
InnoDB为了支持多粒度(表锁与行锁)的锁并存,引入意向锁。意向锁是表级锁,
IS: 意向共享锁
IX: 意向排他锁
事务在请求某一行的S锁和X锁前,需要先获得对应表的IS、IX锁。
意向锁产生的主要目的是为了处理行锁和表锁之间的冲突,用于表明“某个事务正在某一行上持有了锁,或者准备去持有锁”。比如,表中的某一行上加了X锁,就不能对这张表加X锁。
如果不在表上加意向锁,对表加锁的时候,都要去检查表中的某一行上是否加有行锁,多麻烦。
插入意向锁(Insert Intention Lock):
Gap Lock中存在一种插入意向锁,在insert操作时产生。
有两个作用:
和next-key互斥,阻塞next-key 锁,防止插入数据,这样就不会幻读。
插入意向锁互相是兼容的,允许相同间隙、不同数据的并发插入
锁模式
记录锁:单行记录上的锁,行锁是加在索引上的。
间隙锁:锁定记录之间的范围,但不包含记录本身。
Next Key Lock: 记录锁+ 间隙锁,锁定一个范围,包含记录本身。