减少已落实读取隔离级别冲突风险的方法

在“已落实读取”隔离级别中,如果当前会话无法获取锁定或数据库服务器检测到死锁,那么其他会话持有的锁定可能导致 SQL 操作失败。(如果两个用户都保持锁定而每个用户又都想获取另一个用户拥有的锁定时,将发生死锁。)SQL 的 SET ISOLATION COMMITTED READ 语句的 LAST COMMITTED 关键字选项可减少锁冲突的风险。

即使其他并发会话持有互斥锁定,SQL 的 SET ISOLATION COMMITTED READ 语句的 LAST COMMITTED 关键字选项也将指示服务器返回行的最新落实版本。您可以将 LAST COMMITTED 关键字选项用于 B 型树和函数索引、支持事务日志记录的表,以及不具有页级别锁定或互斥锁定的表。有关更多信息,请参阅 GBase 8s SQL 指南:语法 中 SET ISOLATION 语句的信息。

对于使用事务日志记录创建的数据库,当使用“脏读取”或“已落实读取”隔离级别(或“读取未落实”的 ANSI/ISO 级别或“读取已落实”的 ANSI/ISO 级别)的会话尝试读取并发会话保持共享锁定的行时,您可以设置 USELASTCOMMITTED 配置参数来指定数据库服务器是否使用上次落实的数据版本,而不是等待锁定释放。上次落实的数据版本是任何更新发生之前存在的数据版本。

如果没有为 USELASTCOMMITTED 配置参数或 USELASTCOMMITTED 会话环境变量设置任何值或 NONE 值,那么 COMMITTED READ 或 READ COMMITTED 隔离级别中的会话将等待任何互斥锁定释放,除非 SQL 的 SET ISOLATION COMMITTED READ LAST COMMITTED 语句指示数据库服务器读取最新落实的数据版本。

只有发生并发冲突更新时,设置 USELASTCOMMITTED 配置参数以与“已落实读取”隔离级别一起运行才能够影响性能。发生并发冲突更新时,查询性能取决于事务的动态。例如,使用上次落实的数据版本的阅读器可能需要通过其他并发事务来撤销对行进行的更新。该情境涉及读取一个或多个日志记录,从而增加可以影响性能的 I/O 流量。