概述
锁的分类
按操作类型可分为 读锁与写锁
读锁
读锁为共享锁,表被读锁上锁后,其他Session 可以并发读
写锁
写锁为独占锁 表被上写锁后,其他Session不能进行其他任何读写操作
按操作粒度可分为 行锁 表锁 页锁
行锁
行锁就是对表中的某行进行上锁,由于对行进行上锁,所以他的开销大,加锁慢,会出现死锁
优点:锁的粒度小,发生冲突概率低,并发度高
同时InnoDB由于加锁方式为行锁,所以他能够对事务进行支持
表锁
表锁即为对整张表进行上锁,所以他的 开销小,加锁快,不会产生死锁
缺点:锁粒度大,发生锁冲突的概率高,并发度低
MyISAM中
MyISAM中不具备行锁功能,所以在MyISAM中使用的为表锁
读锁 | 写锁 | |
---|---|---|
本Session | 读操作正常,写操作报错, | |
读其他表报错(mysql自我保护,需要保证解锁后才能进行其他操作) | 读操作正常,写操作正常, | |
读其他表报错(mysql自我保护,需要保证解锁后才能进行其他操作) | ||
其他Session | 读操作正常,写操作阻塞 | 读操作阻塞,写操作阻塞, |
表锁分析
InnoDB中
行锁分析
由于加锁方式为行锁,所以他能够对事务进行支持
索引失效导致行锁变表锁
由于索引失效,数据库中针对某一行的操作将会需要全表扫描才能完成,而被扫描到的行都会被加锁,所以相当于表锁
间隙锁
当使用范围条件而不是等值条件请求检索并请求锁后,InnoDB会给符合条件的所有有记录的索引项加锁;
对于不符合条件并且不存在的记录就称之为间隙.
InnoDB也会对这个间隙加锁,即为间隙锁
优化建议
.