📜  DBMS-并发控制

📅  最后修改于: 2021-01-11 06:22:12             🧑  作者: Mango


在可以同时执行多个事务的多程序环境中,控制事务的并发性非常重要。我们有并发控制协议,以确保并发事务的原子性,隔离性和可序列化性。并发控制协议可以大致分为两类-

  • 基于锁的协议
  • 基于时间戳的协议

基于锁的协议

配备有基于锁的协议的数据库系统使用一种机制,通过该机制,任何事务都必须在获得适当的锁之前才能读取或写入数据。锁有两种-

  • 二进制锁-数据项上的锁可以处于两种状态;它是锁定的还是未锁定的。

  • 共享/独占-这种类型的锁定机制根据锁的用途来区分锁。如果获取了数据项上的锁以执行写操作,则它是排他锁。如果在同一个数据项上写入多个事务,则会导致数据库进入不一致状态。由于没有更改数据值,因此共享读取锁。

有四种类型的锁定协议可用-

简化锁协议

基于简单锁的协议允许事务在执行“写”操作之前获得对每个对象的锁。事务可以在完成“写”操作后解锁数据项。

声明锁协议

声明前的协议评估其操作并创建需要锁定的数据项列表。在开始执行之前,事务将事先向系统请求其所需的所有锁。如果授予了所有锁,则事务将在其所有操作结束后执行并释放所有锁。如果未授予所有锁,则事务将回滚并等待直到授予所有锁。

预先声明

两相锁定2PL

该锁定协议将事务的执行阶段分为三个部分。在第一部分中,当事务开始执行时,它会为其所需的锁寻求许可。第二部分是事务获取所有锁的位置。一旦事务释放第一锁,第三阶段便开始。在此阶段,事务不能要求任何新的锁;它仅释放获得的锁。

两相锁定

两阶段锁定有两个阶段,一个阶段是增长阶段,在该阶段,事务将获取所有锁定;第二阶段是增长阶段。第二阶段正在缩小,该事务所持有的锁正在释放。

要声明排他(写)锁,事务必须首先获取共享(读)锁,然后将其升级为排他锁。

严格的两相锁定

Strict-2PL的第一阶段与2PL相同。在第一阶段获取所有锁之后,事务将继续正常执行。但是与2PL相比,Strict-2PL在使用后不释放锁。 Strict-2PL保留所有锁直到提交点,然后一次释放所有锁。

严格的两相锁定

Strict-2PL不像2PL那样具有级联中止。

基于时间戳的协议

最常用的并发协议是基于时间戳的协议。该协议使用系统时间或逻辑计数器作为时间戳。

基于锁的协议在执行时管理事务之间冲突对之间的顺序,而基于时间戳的协议则在创建事务后立即开始工作。

每个交易都有一个与之关联的时间戳,其顺序由交易的时间确定。在0002时钟时间创建的事务要早于其后的所有其他事务。例如,任何在0004进入系统的事务“ y”都要年轻两秒,并且优先级将优先于老事务。

此外,每个数据项都具有最新的读写时间戳。这使系统知道何时对数据项执行了最后的“读取和写入”操作。

时间戳订购协议

时间戳排序协议可确保事务在其冲突的读写操作中的可序列化性。协议系统的责任是应根据事务的时间戳值执行冲突的任务对。

  • 事务T i的时间戳记为TS(T i )。
  • 数据项X的读取时间戳记由R-timestamp(X)表示。
  • 数据项X的写入时间戳记由W-timestamp(X)表示。

时间戳顺序协议的工作方式如下-

  • 如果事务Ti发出read(X)操作-

    • 如果TS(Ti)
    • 操作被拒绝。
  • 如果TS(Ti)> = W-时间戳(X)
    • 操作已执行。
  • 所有数据项时间戳已更新。
  • 如果事务Ti发出write(X)操作-

    • 如果TS(Ti)
      • 操作被拒绝。
    • 如果TS(Ti)
      • 操作被拒绝,钛回滚。
    • 否则,执行操作。

    托马斯的写作规则

    该规则说明如果TS(Ti)i回滚。

    可以修改时间戳排序规则,以使时间表视图可序列化。

    而不是让T i回滚,而是忽略了“写”操作本身。