InnoDB锁体系
2021-09-28 16:40:54 0 举报
innodb锁体系
作者其他创作
大纲/内容
Insert Intention Lock(特殊的gaplock)
表级锁
Jayha
通过MVCC绕过锁机制,读取之前版本undo里记录的数据,提高并发性
Next Key Lock
S锁
行级锁(行级语句命中索引锁next-key(可能降级),不命中索引锁整个树所有索引和gap)
LOCK(一般意义来讲的锁,锁的是事务)
命中唯一索引的情况下降级
Container
在加上行锁的时候顺便为表加上这个锁,防止其他事物想加表锁时,需要全表遍历
在右边界没有的情况下降级
latch锁线程临界资源,用读写锁互斥量控制
IS锁
X锁
AUTO-INCR LOCK
共享锁(S锁):事务读取一条记录时,需要先获取该记录的S锁,可以同时对一条记录加S锁。独占锁(X锁):事务改动一条记录时先要获取X锁,与任何锁都互斥。意向共享锁(IS锁):当某事务准备给某条记录加S锁的时,先在表级别加IS锁。意向独占锁(IX锁):当事务准备给某条记录加X锁时,先在表级别加IX锁。
在insert语句的record锁的同时,如果有主键增长,触发这个锁,insert语句完成后立刻释放,不需要等待事务完成,之前是5.0之前表锁实现,现在是互斥量mutex实现
锁问题: 脏读,不可重复读(两次读到的数据值不一致,read commit解决),幻读(使用next-key机制解决)丢失更新(X锁使得事务一个个执行解决)。
Record Lock(记录锁)
InnoDB锁体系
Gap Lock(间隙锁)
IX锁
插入意向锁(Insert Intention Locks)Gap Lock中存在一种插入意向锁(Insert Intention Lock),在insert操作时产生。在多事务同时写入不同数据至同一索引间隙的时候,并不需要等待其他事务完成,不会发生锁等待。假设有一个记录索引包含键值4和7,不同的事务分别插入5和6,每个事务都会产生一个加在4-7之间的插入意向锁,获取在插入行上的排它锁,但是不会被互相锁住,因为数据行并不冲突。相当于给新插入行更大的粒度gap内加了锁的意向锁,而新插入的行是record lock。和nextkey冲突,该区间除了插入外,可以当成gaplock用
MyISAM只支持表级锁
一致性非锁定读:
收藏
收藏
0 条评论
回复 删除
下一页