共享锁(S)、排他锁(X)和增量锁(I)的兼容矩阵
这个矩阵通常描述在同一数据项上,请求某个锁的事务是否能与当前持有某种锁的事务兼容。
当前持有锁 \ 请求锁 | S (共享) | X (排他) | I (增量) |
---|---|---|---|
S (共享) | ✅ | ❌ | ❌ |
X (排他) | ❌ | ❌ | ❌ |
I (增量) | ❌ | ❌ | ✅ |
共享锁(S)、排他锁(X)和更新锁(U)的兼容矩阵
这个矩阵通常描述在同一数据项上,请求某个锁的事务是否能与当前持有某种锁的事务兼容。
当前持有锁 \ 请求锁 | S (共享) | X (排他) | U (更新) |
---|---|---|---|
S (共享) | ✅ | ❌ | ✅ |
X (排他) | ❌ | ❌ | ❌ |
U (更新) | ✅ | ❌ | ❌ |
解释: |
- S vs S (✅): 多个事务可以同时持有同一数据项的共享锁,以便并发读取。
- S vs X (❌): 持有共享锁时,不能授予排他锁。
- S vs U (✅): 持有共享锁时,可以授予更新锁(一个事务持有 U 锁,其他事务可以同时持有 S 锁,但不能有其他 U 或 X 锁)。
- X vs 任何锁 (❌): 持有排他锁时,任何其他锁请求都不被允许。
- U vs S (✅): 持有更新锁时,可以授予共享锁。
- U vs X (❌): 持有更新锁时,不能授予排他锁。
- U vs U (❌): 任何时候,只能有一个事务持有同一数据项的更新锁。
意向锁(IS, IX, SIX)、共享锁(S)和排他锁(X)的兼容矩阵
这个矩阵通常描述在多粒度锁定层次结构中,请求某个锁的事务是否能与当前持有某种锁的事务在同一节点上兼容。
当前持有锁 \ 请求锁 | IS (意向共享) | IX (意向排他) | S (共享) | SIX (共享意向排他) | X (排他) |
---|---|---|---|---|---|
IS (意向共享) | ✅ | ✅ | ✅ | ✅ | ❌ |
IX (意向排他) | ✅ | ✅ | ❌ | ❌ | ❌ |
S (共享) | ✅ | ❌ | ✅ | ❌ | ❌ |
SIX (共享意向排他) | ✅ | ❌ | ❌ | ❌ | ❌ |
X (排他) | ❌ | ❌ | ❌ | ❌ | ❌ |
解释: |
- X vs 任何锁 (❌): 持有排他锁时,任何其他锁请求都不被允许。
- S vs S (✅): 兼容并发读取。
- S vs X (❌): 不兼容读写冲突。
- S vs IS (✅): 持有 S 锁不妨碍其他事务在子节点上设置 IS。
- S vs IX (❌): 持有 S 锁会阻止其他事务在子节点上设置 IX(因为最终会在子节点请求 X 锁)。
- S vs SIX (❌): 持有 S 锁会阻止其他事务在子节点上设置 SIX。
- IX vs IS (✅): 持有 IX 锁不妨碍其他事务在子节点上设置 IS。
- IX vs IX (✅): 多个事务可以在子节点上设置 IX。
- IX vs S, SIX, X (❌): 持有 IX 锁会阻止其他事务在当前节点或其子节点上获取 S, SIX, X 锁。
- IS vs 任何意向锁或 S, SIX (✅): 持有 IS 锁不妨碍其他事务在子节点上获取 IS, IX, S, SIX 锁。
- IS vs X (❌): 持有 IS 锁会阻止其他事务在当前节点获取 X 锁。
- SIX vs IS (✅): 持有 SIX 锁不妨碍其他事务在子节点上设置 IS。
- SIX vs IX, S, SIX, X (❌): 持有 SIX 锁会阻止其他事务在当前节点或子节点上获取 IX, S, SIX, X 锁。
教材中还提到了增量锁 (I) [58, 59],并指出 INi(A), INj(A)
不冲突,意味着 I 锁与 I 锁是兼容的 [59]。但教材未提供 I 锁与 S, X, U, IS, IX, SIX 锁的兼容性信息,因此无法在此处列出完整的包含 I 锁的兼容矩阵。