锁定协议在数据库管理系统中用作并发控制的一种手段。多个事务可能同时请求锁定一个数据项。因此,我们需要一种机制来管理事务发出的锁定请求。这种机制称为锁管理器。它依赖于消息传递过程,其中事务和锁管理器交换消息来处理数据项的锁定和解锁。
锁管理器中使用的数据结构 –
实现锁定所需的数据结构称为锁表。
- 它是一个哈希表,其中数据项的名称用作哈希索引。
- 每个锁定的数据项都有一个关联的链表。
- 链表中的每个节点代表请求锁定的事务、请求锁定的模式(互斥/互斥)和请求的当前状态(授予/等待)。
- 数据项的每一个新的锁请求都会作为一个新节点添加到链表的末尾。
- 哈希表中的冲突通过单独链接技术处理。
考虑以下锁表示例:
说明:在上图中,锁表中存在的锁定数据项为5、47、167和15。
已请求锁定的事务由使用向下箭头显示在它们下方的链表表示。
链表中的每个节点都有请求数据项的事务的名称,如 T33、T1、T27 等。
节点的颜色代表状态,即锁定是否已被授予或正在等待。
请注意,数据项 5 和 47 发生了冲突。它已通过单独的链接解决,其中每个数据项都属于一个链表。数据项充当包含锁定请求的链表的标头。
锁管理器的工作 –
- 最初锁定表是空的,因为没有数据项被锁定。
- 每当锁管理器从事务 T i收到对特定数据项 Q i的锁请求时,可能会出现以下情况:
- 如果 Q i尚未锁定,则将创建一个链表并将锁定授予请求事务 T i 。
- 如果数据项已被锁定,则将在其链表末尾添加一个新节点,其中包含有关 T i发出的请求的信息。
- 如果T i请求的锁模式与当前拥有锁的事务的锁模式兼容,T i也将获取锁,状态将更改为“已授予”。否则, T i的锁定状态将为“等待”。
- 如果交易 T i想要解锁它当前持有的数据项,它将向锁管理器发送解锁请求。锁管理器将从这个链表中删除 T i 的节点。锁定将授予列表中的下一个事务。
- 有时事务 T i可能不得不中止。在这种情况下,T i发出的所有等待请求都将从锁表中存在的链表中删除。一旦流产完成,T i持有的锁也将被释放。
参考 –
数据库系统概念,第 6 版