📜  DBMS中锁的实现

📅  最后修改于: 2021-09-08 16:21:58             🧑  作者: Mango

锁定协议在数据库管理系统中用作并发控制的一种手段。多个事务可能同时请求锁定一个数据项。因此,我们需要一种机制来管理事务发出的锁定请求。这种机制称为锁管理器。它依赖于消息传递过程,其中事务和锁管理器交换消息来处理数据项的锁定和解锁。

锁管理器中使用的数据结构 –
实现锁定所需的数据结构称为锁表

  1. 它是一个哈希表,其中数据项的名称用作哈希索引。
  2. 每个锁定的数据项都有一个关联的链表。
  3. 链表中的每个节点代表请求锁定的事务、请求锁定的模式(互斥/互斥)和请求的当前状态(授予/等待)。
  4. 数据项的每一个新的锁请求都会作为一个新节点添加到链表的末尾。
  5. 哈希表中的冲突通过单独链接技术处理。

考虑以下锁表示例:

说明:在上图中,锁表中存在的锁定数据项为5、47、167和15。

已请求锁定的事务由使用向下箭头显示在它们下方的链表表示。

链表中的每个节点都有请求数据项的事务的名称,如 T33、T1、T27 等。

节点的颜色代表状态,即锁定是否已被授予或正在等待。

请注意,数据项 5 和 47 发生了冲突。它已通过单独的链接解决,其中每个数据项都属于一个链表。数据项充当包含锁定请求的链表的标头。

锁管理器的工作 –

  1. 最初锁定表是空的,因为没有数据项被锁定。
  2. 每当锁管理器从事务 T i收到对特定数据项 Q i的锁请求时,可能会出现以下情况:
    • 如果 Q i尚未锁定,则将创建一个链表并将锁定授予请求事务 T i
    • 如果数据项已被锁定,则将在其链表末尾添加一个新节点,其中包含有关 T i发出的请求的信息。
  3. 如果T i请求的锁模式与当前拥有锁的事务的锁模式兼容,T i也将获取锁,状态将更改为“已授予”。否则, T i的锁定状态将为“等待”。
  4. 如果交易 T i想要解锁它当前持有的数据项,它将向锁管理器发送解锁请求。锁管理器将从这个链表中删除 T i 的节点。锁定将授予列表中的下一个事务。
  5. 有时事务 T i可能不得不中止。在这种情况下,T i发出的所有等待请求都将从锁表中存在的链表中删除。一旦流产完成,T i持有的锁也将被释放。

参考 –
数据库系统概念,第 6 版