OB的LCL算法学习笔记

标签:
oceanbase |
分类: 工作学习 |
OB的LCL算法是边追逐算法:依据事务依赖关系向下游节点发送消息,死锁产生的环将通过这些消息被推断出来。
参考https://zhuanlan.zhihu.com/p/624847601 算法过程理解如下:
事务的全局等待关系是一个有向图,每个节点是一个处于等待状态的事务,每个边是一个等待关系。SCC是强连通分量,即一个死锁环。
对于每个事务节点存储如下信息:
1.
对于每个事务启动的时候会分配一个PrID和PrAP,为顶点私有的长亮编号和优先级。这个分配过程是递增的,一个事务分配后PrID和PrAP是固定的。
2.
每个事务节点存储PuID和PrAP,用于存储它目前发现的可能是阻塞它的最晚启动的事务的PrID和PrAP。PuID和PrAP是变量,随着算法的推演会被改变。
3. 每个事务节点存储一个LCLV,用于存储它目前可能阻塞的最大锁等待链长度。
算法的执行过程分为3个阶段:繁殖阶段、扩散阶段和检测阶段:
1. 繁殖阶段
2. 扩散阶段
3. 检测阶段

其他思考和疑问:
1. 一个算法3阶段周期只会破除一个SCC死锁环,因为如果有其他的SCC环,那么他们的(PuAP,
PuID)已经是全局最晚的节点了,需要在下一轮3阶段算法中破除了。
2.
实际运行中的一个数据系统的锁等待图应该是一个动态的有向图,每个节点只是向下游其他节点发送信息,那由谁来进行算法阶段的切换与轮次周期的切换?
转载请注明转自高孝鑫的博客!
前一篇:金融核心常见并行验证切换策略
后一篇:保险养老金业务粗析