Mysql的锁机制
按对数据的操作类型可分为:
1.读锁(共享锁):简称S锁,在事务要读取一条记录时,需要先获取该记录的 S锁 。(读读共享,读写互斥)
2.写锁(独占锁):又称排他锁,简称X锁,在事务要改动一条记录时,需要先获 取该记录的 X锁 。(读写互斥,写写互斥)
按锁的粒度可分为:
1.表级别锁
1.表级别的读锁和写锁(机制同上)
2.意向锁
意向共享锁( Intention Shared Lock ):简称 IS锁 ,当事务准备给某条记录加S锁的时候,需要先给表级别加一个IS锁。
意向独占锁( Intention Exclusive Lock ):简称 IX锁 ,当事务准备给某条记录加X锁的时候,需要先给表级别加一个IX锁。
兼容性 X IX S IS
X 不兼容 不兼容 不兼容 不兼容
IX 不兼容 兼容 不兼容 兼容
S 不兼容 不兼容 兼容 兼容
IS 不兼容 兼容 兼容 兼容
3.自增锁(AUTO-INC):AUTO-INC锁的作用范围只是单个插入语句,插入完成,AUTO-INC锁就释放了,并不需要等到事务提交。
2.行级别锁
1.记录锁(行锁,Record Locks):对一条记录上锁(对一行数据上锁),其他范围不受影响。
2.间隙锁(Gap Locks):给区间内加锁(开区间)。
3.临键锁(Next-Key Locks):这是一种特殊的间隙锁,前面Gap Locks的范围是开区间,而这里的Next-Key Locks 是前开后闭区间,即包括右端点记录(右端点记录同时被锁定)。
4.插入意向锁(Insert Intention Locks ):一种特殊的间隙锁,多个事务,在同一个索引,同一个范围区间插入记录时,如果插入的位置不冲突,不会阻塞彼此。
3.页级别锁
按对锁的态度可分为:
1.悲观锁:就悲观锁而言,它是很没有安全感的,时刻觉得在自己读取数据或者怎样的时候,别人会对其进行干扰;所以每次在拿数据的时候都会上锁 ,比如行锁,表锁等;读锁,写锁等,都是在做操作之前先上锁,当其他事务想要访问同一数据时,都会阻塞等待。
适合写操作多的场景 ,可以在数据库层面阻止其他事务对该数据的操作权限,防止 读 - 写 和 写 - 写 的冲突。
2.乐观锁:乐观锁是很积极向上的,它认为同一数据被并发操作是小概率事件,很少发生的,所以它不采用数据库自身的锁机制,而是采用一定的程序机制来判断数据前后是否发生变化。
适合 读操作多 的场景,它不加锁,不会引发死锁问题。
按加锁方式分为:
1.显式锁
2.隐式锁