锁定示例

在此示例中,两个会话 A 和 B 处于活动状态,并尝试处理表 T1。在示例开始时,表 T1 具有一列 (C1),但没有任何行。

这里的步骤说明的是从会话 A 和会话 B 可执行的一系列事务:

  1. 两个会话中的事务都获取了 S 锁,以便从表 T1 进行读取。

  2. 会话 B 释放了其针对 COMMIT 语句的 S 锁定。

  3. 会话 A 可升级到 SI 锁并插入到 T1,因为会话 B 释放了其 S 锁。

  4. 执行 COMMIT 语句后,会话 A 释放了其 SI 锁。

  5. 两个会话都可以获取 S 锁,因为会话 A 释放了其 SI 锁。

  6. 会话 A 无法获取 SI 锁,因为会话 B 未释放其 S 锁。SI 锁与 S 锁不兼容。

  7. 会话 B 释放了其针对 COMMIT 语句的 S 锁定。

  8. 会话 A 现在可以升级到 SI 锁并插入 T1。

  9. 会话 B 会尝试从 T1 删除一个行,但无法获取 X 锁,因为会话 A 未释放其 SI 锁。SI 锁与 X 锁不兼容。

  10. 会话 A 继续向 T1 插入内容。

  11. 会话 A 释放其 SI 锁。

  12. 会话 B 现在可以获取 X 锁并执行删除操作。

此图说明了前述步骤:

另请参阅:

Vertica 数据库锁 锁定模式