ANSI Read Committed 与 GBase 8s Committed Read 隔离

当程序请求 ANSI Read Committed 或 GBase 8s Committed Read 隔离级别时,数据库服务器保证它从不返回未提交到数据库的行。此操作防止读取未提交的或后来回滚的数据。

ANSI Read Committed 或 GBase 8s Committed Read 实现简单。在它访存行之前,数据库服务器测试来确定更新进程是否在该行上放置了锁;如果没有,则它返回该行。由于已被更新了的(但还未提交的)行在它们上面有锁,因此,此测试确保程序不读取未提交的数据。

ANSI Read Committed 或 GBase 8s Committed Read 实际上不在访存了的行上放置锁,因此,此隔离级别几乎与 ANSI Read Uncommitted 或 GBase 8s Dirty Read 一样有效率。当将每一行数据作为独立的单元处理,未引用同一表或其他表中的其他行时,适于使用此隔离级别。

然而,如果由于并发会话持有行上的共享锁,导致放置该测试锁的尝试不成功,则在 ANSI Read Committed 或 GBase 8s Committed Read 会话中可发生锁定冲突。要避免等待并发进程(通过提交或回滚来)释放共享锁, GBase 8s 支持 Committed Read 隔离级别的 Last Committed 选项。当此 Last Committed 选项生效时,由另一会话的共享锁导致该查询返回该行的最近提交了的版本。

还可通过将 USELASTCOMMITTED 配置参数设置为 'COMMITTED READ' 或设置为 'ALL',或通过当用户连接到数据库时设置 sysdbopen( ) 过程中的 SET ENVIRONMENT 语句中的 USELASTCOMMITTED 会话环境选项,来激活 Last Committed 特性。要获取关于 ANSI Read Committed 的 Last Committed 选项,或 GBase 8s Committed Read 隔离级别的更多信息,请参阅 GBase 8s SQL 指南:语法 中的 SET ISOLATION 语句的描述。要获取关于 USELASTCOMMITTED 配置参数的信息,请参阅 GBase 8s 管理员参考手册