【问题标题】:2PL, Rigorous vs Strict Model, Is there any benefit?2PL,严格与严格模型,有什么好处吗?
【发布时间】:2015-04-18 21:09:39
【问题描述】:

在 2PL(两相锁定)中,严格模型相对于严格模型有什么优势?

I) 与严格模型相比没有优势。

II) 与严格模型相比,它保证不会发生饥饿。

III) 相对于严格模型,它保证不会发生死锁。

IV) 与严格模型相比,不需要预测未来需要的数据。

我的笔记说以上所有内容都是错误的。我有点困惑。有人可以为我澄清一下为什么所有这些都是错误的吗?

【问题讨论】:

  • 严格的 2PL 只是意味着在事务结束后释放所有锁(相对于严格的只读锁可能更早释放)。这不会影响死锁,因为死锁发生在扩展阶段。第四点可能部分正确(取决于观点):如果您在事务结束时释放所有读锁,那么事务甚至不必考虑是否应该释放读锁或保留它以供以后读取在交易中。
  • @SimoKivistö 你能把它作为答案发布吗?
  • 已扩展并作为答案发布。

标签: sql database oracle database-design database-schema


【解决方案1】:

什么是两阶段锁定 (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 相同,但在事务已成功提交或中止之前持有所有锁。 – 用于动态环境 事先不知道数据访问模式的地方。

没有死锁。此外,一个较年轻的交易请求由 旧事务被中止并以相同的时间戳重新启动,避免了饥饿。

希望以上 带有图表的清晰解释必须使您清楚 严谨的理念和优势。

谢谢

【讨论】:

    【解决方案2】:

    我 - 有一个优势

    this lecture note from UCLA

    严格的两相锁定具有严格 2PL 的优点。此外 它具有对于两个冲突事务的属性,它们的提交顺序 是它们的可序列化顺序。在某些系统中,用户可能会期待这种行为。

    These lecture notes有一个例子(例子中的模型是严格-不严格):

    考虑在同一站点进行的两个事务,其中读取 x 的长时间运行事务 T1 排在写入 x 的短事务 T2 之前。 T2 先返回,在 T1 基于旧版本完成之前显示 x 的更新版本。

    II 和 III - 不影响死锁/饥饿

    严格的 2PL 意味着所有锁在事务结束后释放,而不是严格的,只读锁可能更早释放。这不会影响死锁或饥饿,因为它们发生在 expanding 阶段(事务无法获得所需的锁)。在死锁中,两个进程始终处于扩展阶段。

    IV - 两者都需要知道在扩展阶段锁定所需的数据 - 收缩阶段各不相同

    Strict:我不知道 strict 2PL 的通常实现细节,但是如果在事务结束之前释放读锁,则必须有知识(如果你愿意,100% 肯定预测)在事务的后期不需要锁。
    严格:所有读锁都在事务结束时释放,事务永远不必评估它是否应该释放读锁或保留它以供以后在事务中读取。


    使用/首选严格还是严格?

    使用这两种模型中的哪一种取决于具体情况。现代 DBMS 使用比简单严格或严格的 2PL 更复杂的并发处理。话虽如此,从Wikipedia article on two-phase locking 来看,严格(SS2PL)模型使用更广泛:

    SS2PL [严格] 一直是大多数数据库系统选择的并发控制协议,自 1970 年代早期就开始使用。 [...]

    一般形式的 2PL 以及与 Strictness 结合使用时,即 Strict 2PL (S2PL),在实践中是未知的。流行的 SS2PL 不需要像 2PL 和 S2PL 那样标记“阶段 1 结束”,因此实现起来更简单。此外,与一般的 2PL 不同,SS2PL 提供了有用的 Strictness 和 Commitment 排序属性,如上所述。 [...]

    SS2PL 对比。 S2PL:两者都提供可序列化性和严格性。由于 S2PL 是 SS2PL 的超类,原则上它可以提供更多的并发性。但是,通常实际上并没有注意到并发优势(两者都存在完全相同的锁定,实际上 S2PL 的锁定释放时间并不早),以及在 S2PL 中处理与事务分离的第 1 阶段结束机制的开销结束,是没有道理的。此外,虽然 SS2PL 提供承诺排序,但 S2PL 不提供。这解释了 SS2PL 优于 S2PL。 [...]

    【讨论】:

    • 在答案中添加了一些信息。 简化: 首选严谨。
    • 我的教授。写(4)是真的。你能解释一下为什么(4)是真的吗?
    • 好吧,如果"不需要预测未来需要的数据" 意味着"不需要预测当前语句的数据稍后需要” 这是因为严格可能在事务结束之前释放 read_locks。因此它需要知道这些行在事务中可能的未来使用(如果稍后在同一个事务中读取它们,则无法释放锁)。如果问题中的 “预测未来需要的数据” 有其他含义,那么您必须澄清问题的那一部分。
    • 需要澄清,哪一个是真的?
    • 我的问题是在 S2PL 中我们不需要预测未来需要的数据。不是吗?
    【解决方案3】:

    上例中的事务 T2 不遵循 2PL 和 S2PL,因为锁请求(锁 B)是在锁释放 unlock(A) 之后完成的 - 因此违反了协议。

    【讨论】:

      【解决方案4】:

      严格的两相锁定类似于严格的两相锁定,但有两个主要区别:

      1. 在严格的两阶段锁定中,共享锁在 收缩阶段,但在严格的两阶段锁定所有共享 并且排他锁会一直保留到事务结束。
      2. 在严格的两相锁定中,我们不需要知道访问权限 预先锁定数据项的模式,因此更合适 对于动态环境,同时在严格的两相锁定 锁的访问模式应在开始时指定 交易。

      所以第四个选项是正确的。

      【讨论】:

        猜你喜欢
        • 2015-06-25
        • 1970-01-01
        • 2012-08-18
        • 2011-03-09
        • 2017-03-11
        • 2012-11-12
        • 1970-01-01
        • 1970-01-01
        • 2012-05-18
        相关资源
        最近更新 更多