基于图形的协议是实现基于锁的协议的另一种方式。
正如我们所知,基于锁的协议的主要问题是避免死锁并确保严格的时间表。我们已经看到,遵循 Strict 或 Rigorous 2-PL 可以使用 Strict Schedules。我们甚至已经看到如果我们遵循 Conservative 2-PL 就可以避免死锁,但是这个协议的问题是它不能实际使用。基于图的协议被用作 2-PL 的替代方案。基于树的协议是基于图的协议的简单实现。
该协议的先决条件是我们知道访问数据库项的顺序。为此,我们对一组数据库项 (D) {d 1 , d 2 , d 3 , ….., d n }实施部分排序。执行部分排序后的协议声明为-
- 如果d I – > dĴ然后访问dĴ之前,访问这两个d i和dĴ必须访问d我的任何事务。
- 意味着集合D现在可以被视为一个有向无环图 (DAG),称为数据库图。
基于树的协议 –
- 数据库项目的部分顺序决定了树状结构。
- 只允许使用排他锁。
- T i的第一个锁可以在任何数据项上。随后,只有当 Q 的父节点当前被 T i锁定时,数据 Q 才能被 T i锁定。
- 数据项可以随时解锁。
遵循基于树的协议可确保冲突可串行化和无死锁调度。我们不需要像在 2-PL 协议中那样等待解锁数据项,从而增加了并发性。
现在,让我们看一个示例,以下是一个数据库图,将用作后续锁定项目的参考。
图像 –数据库图
让我们看一个基于上述数据库图的示例。我们在这个调度中有三个事务,这是一个骨架示例,即,我们将只看到锁定和解锁的工作原理,让我们保持简单,不要通过添加数据操作来使其复杂。
T1 | T2 | T3 | |
---|---|---|---|
1 | Lock-X(A) | ||
2 | Lock-X(B) | ||
3 | Lock-X(D) | ||
4 | Lock-X(H) | ||
5 | Unlock-X(D) | ||
6 | Lock-X(E) | ||
7 | Lock-X(D) | ||
8 | Unlock-X(B) | ||
9 | Unlock-X(E) | ||
10 | Lock-X(B) | ||
11 | Lock-X(E) | ||
12 | Unlock-X(H) | ||
13 | Lock-X(B) | ||
14 | Lock-X(G) | ||
15 | Unlock-X(D) | ||
16 | Unlock-X(E) | ||
17 | Unlock-X(B) | ||
18 | Unlock-X(G) |
从上面的例子中,首先看到调度是Conflict Serializable。锁的可串行化可以写成T 2 –> T 1 –> T 3 。
Locked 和 Unlocked 数据项遵循与上述相同的规则并遵循数据库图。
因此,让我们再次修改基于图形的协议的关键点。
优势 –
- 确保冲突可序列化计划。
- 确保无死锁调度
- 可以随时解锁
有一些优点也有一些缺点。
坏处 –
- 有时可能会发生不必要的锁定开销,比如如果我们想要 D 和 E,那么至少我们必须锁定 B 以遵循协议。
- 级联回滚仍然是一个问题。我们不遵循何时可能发生解锁操作的规则,因此此协议仍然存在此问题。
总的来说,该协议因其实现死锁自由的独特方式而广为人知并被使用。
参考资料:数据库系统概念,第五版 [Silberschatz, Korth, Sudarshan],第 16 章。