在2PL(两阶段锁定)中,严格模型对严格模型有哪些优势?
I)严格模型没有优势。
II)与严格模型相反,它保证不会发生饥饿。
III)与严格模型相比,它保证不会发生死锁。
IV)与严格模型相比,没有必要预测未来所需的数据。
我的笔记说以上所有都是假的。我有点困惑。有人可以为我澄清为什么所有这些都是假的?
答案 0 :(得分:12)
什么是两阶段锁定(2PL)协议?
A transaction is two-phase locked if:
before reading x, it sets a read lock on x
before writing x, it sets a write lock on x
it holds each lock until after it executes the corresponding operation
after its first unlock operation, it requests no new locks
现在,什么是严格锁相?
此处事务必须保留所有独占锁,直到它提交/中止为止。
但是,有什么严格的2PL?
严格的两相锁定甚至更严格:此处所有锁都保持到提交/中止。在此协议中,事务可以按照它们提交的顺序进行序列化。
更深入:
严格2PL:
与2PL相同但保留所有排他锁,直到事务已成功提交或中止。 - 它保证无级联可恢复性
严格的2PL:
与Strict 2PL相同但保持所有锁定,直到事务已成功提交或中止。 - 它用于动态环境 数据访问模式事先不知道的地方。
没有死锁。此外,一个年轻的交易请求一个项目持有的项目 旧事务被中止并以相同的时间戳重新启动,避免了饥饿。
我希望如上 清楚的解释与图表必须让你清楚 严谨的概念和优势。
谢谢
答案 1 :(得分:4)
查看this lecture note from UCLA:
严格的两相锁定具有严格的2PL优势。此外 它具有两个冲突事务的属性,即它们的提交顺序 是他们的可串行化顺序。在某些系统中,用户可能会期望这种行为。
These lecture notes有一个例子(示例中的模型是严格的 - 不严谨):
考虑在同一站点进行的两个事务,其中读取x的长时间运行的事务T1在写入x的短事务T2之前被排序。 T2首先返回,在T1完成之前显示x的更新版本,基于旧版本。
严格的2PL意味着在事务结束后所有锁都是释放,而不是严格可以在之前释放只读锁的地方。这并不会影响扩展阶段(事务无法获取所需锁定)的死锁或饥饿。在僵局中,两个进程总是处于扩展阶段。
严格:我不知道严格的2PL的通常实现细节但是如果在事务结束之前释放了读锁定,那么必须有一个知识(100%肯定预测,如果你比如以后在交易中不需要锁 严格:所有读锁都在事务结束时释放,并且事务永远不必评估它是否应该释放读锁或保留它以便以后读取事务。
使用这两种模型中的哪一种取决于具体情况。现代DBMS使用比简单严格或严格的2PL更复杂的并发处理。说过Wikipedia article on two-phase locking判断严谨(SS2PL)模型的使用范围更广泛:
SS2PL [严谨]一直是大多数数据库系统的首选并发控制协议,自20世纪70年代初期就开始使用。 [...]
2PL的一般形式,以及与Strictness结合使用时,即Strict 2PL(S2PL),在实践中并未被使用。流行的SS2PL不需要标记"第1阶段结束"如2PL和S2PL那样,因此更容易实现。此外,与一般的2PL不同,如上所述,SS2PL提供了有用的Strictness和Commitment排序属性。 [...]
SS2PL比。 S2PL:两者都提供可串行性和严格性。由于S2PL是SS2PL的超类,因此原则上它可以提供更多的并发性。然而,通常几乎没有注意到并发优势(两者都存在完全相同的锁定,实际上没有更早的S2PL锁定释放),以及在S2PL中处理阶段结束1机制的开销,与事务分开 - 结束,没有道理。此外,虽然SS2PL提供承诺订购,但S2PL没有。这解释了SS2PL优于S2PL的偏好。 [...]
答案 2 :(得分:1)
以上示例中的事务T2不遵循2PL和S2PL,因为锁定请求(锁定B)在锁定释放解锁(A)之后完成 - 因此违反了协议。
答案 3 :(得分:1)
严格的两相锁定与严格的两相锁定相似,但有两个主要区别:
第四个选项是正确的。