5.4.5 慢路径锁的授予条件

当且仅当满足如下两个条件时,才可以授予锁。

1. 其他线程没有持有不兼容类型锁。

2. 当前申请的锁的优先级高于请求等待列表中的。

首先通过锁位图判断等待队列,不兼容则不能授予锁。再判断快速路径,不兼容则不能授予锁。最后判断授予锁队列,都兼容则授予锁,不兼容,需要遍历持有锁队列,检查是否其他线程持有不兼容锁,是则不能授予,否则可以授予锁。

5.5 防止低优先级锁饥饿

AntDB-M按照优先级将锁又分了两类,用于解决低优先级锁饥饿问题。

l 独占型(hog): X, SNRW, SNW; 具有较强的不兼容性,优先级高,容易霸占锁,造成其他低优先级锁一直处于等待状态。

l 暗弱型(piglet): SW; 优先级仅高于SRO。

这两种类型锁会分别进行加锁计数。当授予hog类型锁时,如果等待队列中有非hog类型,则计数加1。当授予piglet类型锁时,如果等待队列中有SRO,则计数加1。针对计数是否超过阀值(max_write_lock_count)制定了四种优先级矩阵。在加锁授权检测时,如果两种类型中有任一达到统计阀值,则切换到对应的优先级矩阵,重新检测是否可以授权,此时优先级进行了反转,会提升低优先级锁优先获取锁。当前等待队列里低优先级锁处理完毕后,会重置对应的hog,piglet计数器,并反转优先级。

亚信安慧AntDB:AntDB-M元数据锁(七)_数据库