锁定示例
在此示例中,两个会话 A 和 B 处于活动状态,并尝试处理表 T1。在示例开始时,表 T1 具有一列 (C1),但没有任何行。
这里的步骤说明的是从会话 A 和会话 B 可执行的一系列事务:
-
两个会话中的事务都获取了 S 锁,以便从表 T1 进行读取。
-
会话 B 释放了其针对 COMMIT 语句的 S 锁定。
-
会话 A 可升级到 SI 锁并插入到 T1,因为会话 B 释放了其 S 锁。
-
执行 COMMIT 语句后,会话 A 释放了其 SI 锁。
-
两个会话都可以获取 S 锁,因为会话 A 释放了其 SI 锁。
-
会话 A 无法获取 SI 锁,因为会话 B 未释放其 S 锁。SI 锁与 S 锁不兼容。
-
会话 B 释放了其针对 COMMIT 语句的 S 锁定。
-
会话 A 现在可以升级到 SI 锁并插入 T1。
-
会话 B 会尝试从 T1 删除一个行,但无法获取 X 锁,因为会话 A 未释放其 SI 锁。SI 锁与 X 锁不兼容。
-
会话 A 继续向 T1 插入内容。
-
会话 A 释放其 SI 锁。
-
会话 B 现在可以获取 X 锁并执行删除操作。
此图说明了前述步骤: