可重复读+nextkey lock 避免幻读
谓词锁:锁条件
范围锁:锁定记录时锁定范围
行锁:sx 记录||间歇||+
多粒度锁定:意向锁ISIX(表级别)
锁根据页进行管理,页中记录有锁:位图
事务:记录每个页中持有的锁(link)(等待的锁)
全局哈希表(页-bitmap):记录事务中的行的锁信息
并发控制:拆分互斥量,维护不同的对象
锁类型:S X IS IX AI(自增)
锁标志位:gap wait
插入,判断插入范围是否有锁 1 3 插2,(1,3)由3管理
显式锁 隐式锁
显式锁:gap || no gap S||X
隐式锁 只有X,逻辑概念,无内存记录
锁定聚集索引的一行记录时,如果记录上有辅助索引,辅助索引也要加锁(由于谓词锁需要)
隐式锁存在于聚集索引(如新插入的记录)与辅助索引(如更改的列包含辅助索引)
是否产生隐式锁取决于加锁是否需要等待,需要等待则创建显式锁
记录加锁前,可能需要将隐式锁转化为显式锁,加入全局锁信息:
1.聚集索引记录的隐式锁
根据记录的事务id隐藏列,判断是否为活跃事务,则含有隐式锁
2.辅助索引记录的隐式锁
辅助索引页 保存最大事务id
id< min当前活跃事务,不含
否则:
活跃事务修改了辅助索引记录
|| 活跃事务or已提交事务修改了其他辅助索引记录
判断:聚集索引
1.判断辅助索引记录是否持有隐式锁 == 判断活跃事务insert del update
聚集索引记录 —— trx id && undo ——prev聚集索引记录 辅助索引记录entry?
trx id不活跃,无
prev null insert
rec == entry && del flag不同 del
rec != entry del flag ==1 活跃事务||已提交事务修改了rec
trx != prev 之前事务已修改,无
否则check prev prev
2.若有,返回事务对象
加锁过程
通过主键加锁的语句,对聚集索引记录加锁
辅助索引 ,先对辅助索引记录加锁,再对聚集索引记录加锁
可能需要对下个记录加锁(避免幻读),(当(辅助索引)列包含唯一约束且等值查询,不需要)
行锁维护
插入:表IX 定位记录 检测范围锁(阻塞||直接插入) 插入(更新锁范围) 提交
若表上有辅助索引,进行相同判断
更新:记录X (聚集索引加锁前转化隐式锁、辅助索引加锁后更新页trx id)
记录不能原地更新:伪记录作为临时变量移动记录的锁信息
删除:标记,purge线程后台删除
锁定范围合并后,同一范围可能有不同锁类型
同一范围gap锁可相互兼容??
分裂、合并:移动页中记录的锁信息,维护边界区间锁信息
自增锁:表锁,插入后立即释放,自增锁与其他锁不兼容
自增量缓存在内存,避免同一表锁对象在各事务间不断申请??
死锁:
检测:事务等待图
解决:超时等待,回滚