GBase 8s Cursor Stability 隔离

仅可随同 GBase 8s SQL 语句 SET ISOLATION 使用下一级别 Cursor Stability。

当 Cursor Stability 生效时,GBase 8s 在访存的最新的行上放置锁。它为普通的游标放置共享锁,或为更新游标放置可提升锁。一次仅锁定一行;即,每一次访存一行,释放前一行上的锁(除非更新那一行,在此情况下,保持该锁直到事务结束为止。)由于 Cursor Stability 一次仅锁定一行,因此,它对并发的限制低于表锁或数据库锁。

Cursor Stability 确保在程序检测行时,不更改它。当程序更新基于从该行读取的数据的某个其他的表时,这样的行稳定性非常重要。由于 Cursor Stability,程序保证更新是基于当前的信息的。它防止使用陈旧数据

下列示例说明 Cursor Stability 隔离的有效使用。根据演示数据库,程序 A 想要为制造商 Hero (HRO) 插入新的库存商品。与此同时,程序 B 想要删除制造商 HRO 以及所有与它相关联的库存。可发生下列事件的序列:
  1. 在 Cursor Stability 之下操作的程序 A 从 manufact 表访存 HRO 行来获取制造商代码。此操作在该行上放置共享锁。
  2. 对于那一行,程序 B 发出 DELETE 语句。由于该锁,数据库服务器让该程序等待。
  3. 程序 A 使用它从 manufact 表获得了的制造商代码在 stock 表中插入新行。
  4. 程序 A 在 manufact 表上关闭它的游标,或读取不同的行,释放它的锁。
  5. 程序 B 从等待中被释放,完成该行的删除,并继续删除那些使用制造商代码 HRO 的 stock 的行,包括程序 A 刚刚插入的行。
如果程序 A 使用较低级别的隔离,则会发生下列序列:
  1. 程序 A 读取 manufact 表的 HRO 行来获取制造商代码。未放置锁。
  2. 对于那一行,程序 B 发出 DELETE 语句。操作成功。
  3. 程序 B 删除使用制造商代码 HRO 的所有 stock 行。
  4. 程序 B 结束。
  5. 程序 A 不知道该 HRO 行的它的副本现在是无效的,使用制造商代码 HRO 插入新的 stock 行。
  6. 程序 A 结束。

最后,在 stock 中出现一行,在 manufact 中没有与之相匹配的制造商代码。而且,程序 B 显然有问题;它未删除本应删除的行。使用 Cursor Stability 隔离级别可防止这些后果。

即使使用 Cursor Stability,重新安排前面的场景也可能失败。只需要让程序 B 以与程序 A 相反的序列对表操作。如果在程序 B 移除 manufact 的行之前,从 stock 删除它,则任何程度的隔离都不可防止出错。每当可能发生这种错误时,所有涉及到的程序都必须使用相同的访问顺序。