
锁是 DBMS 中维护并发控制的一个组成部分。任何实现基于锁的并发控制的系统中的事务在获得所需的锁之前都无法读取或写入语句。 基于锁的协议中有两种类型的锁。它们是: - 二进制锁 - 它们只能处于锁定或解锁两种状态之一。
- 共享/独占锁 - 仅在执行读操作时获取共享锁。共享锁可以在多个事务之间共享,因为没有数据被更改。执行写操作时使用排它锁。只有持有排它锁的事务才允许更改数据值。
不同的锁定协议是 - 简单锁定协议在执行写操作之前,事务会获得数据值上的锁。写操作完成后,就可以释放锁了。简单锁定协议的一个示例是: T1 | T2 |
---|
R(A) | | | R(A) | 锁定(B) | | R(B) | | W(B) | | 解锁(B) | | | 锁定(C) | | R(C) | | W(C) | | 解锁(C) | 提交 | | | 提交 |
上面显示了两个事务T1和T2。读操作不需要锁,但在写操作之前,每个事务都会获取锁并在之后释放锁。 两阶段锁定协议两阶段锁定协议有两个阶段,即增长阶段和收缩阶段。事务只有在增长阶段才能获取锁。当进入收缩阶段时,它可以释放之前获取的锁,但无法获取新的锁。排它锁由 X 表示,共享锁由 S 表示。两阶段锁定协议的示例是 - T1 | T2 |
---|
S(A) | | tr> R(A) | | | S(A) | | R(A) | X(B) | | R(B) | | W(B) | | | X(C) | | R(C) | | W(C) | | 解锁(C) | | 解锁(A) | 解锁(B) | | 解锁(A) | | 提交 | | | 提交 |
在上面的示例中,T1和T2使用共享变量A共享锁,因为在 A 上只执行读操作。T1 为写操作获取 B 上的排他锁,并很快释放它。 T2与C的做法相同。 严格两相锁定协议严格两相锁定协议与两相锁定协议类似。唯一的区别是,在严格的 2PL 协议中,协议获取的所有排他锁都需要保留,直到协议提交或中止。严格两阶段锁定协议的示例是: T1 | T2 | tr>
---|
S(A) | | R(A ) | | | S(A) | | R(A) | X(B) | | R(B) | | W(B) | | | X(C) | | R(C) | | W(C) | | 解锁(A) | 解锁(A) | | 提交 | | 解锁(B) | | | 提交 | | Unlock(C) |
在上面的例子中,T1和T2使用共享锁共享变量A,因为对A只执行读操作T1 为写操作获取 B 上的排它锁,T2 为 C 获取排它锁。只有在事务提交后才会释放排它锁。然而,共享锁则没有这样的限制。 严格两阶段锁定协议严格两阶段锁定协议仅仅是两阶段锁定协议和严格两阶段锁定协议的扩展。锁定协议。在这里,事务持有的所有锁,无论是共享的还是独占的,只有在事务提交或中止时才会释放。严格两阶段锁定协议的一个示例是: T1 | T2 | tr>
---|
S(A) | | R(A ) | | | S(A) | | R(A) | X(B) | | R(B) | | W(B) | | | X(C) | | R(C) | | W(C) | 提交 | | 解锁(A) | | 解锁(B) | | | 提交 | | 解锁(A) | | Unlock(C) |
在上面的例子中,T1和T2使用共享锁共享变量A,因为对A只执行读操作. T1 在 B 上获取排他锁进行写操作,T2 在 C 上进行同样的操作。共享锁和排它锁都只有在事务提交后才会释放。 |