对 DB2_EVALUNCOMMITTED、 DB2_SKIPDELETED 和 DB2_SKIPINSERTED 的影响
首先我们来看一下这几个注册表变量的用途:
(1)DB2_SKIPINSERTED
当该变量启用时,将允许 CS 或 RS 扫描跳过未提交的插入行。
实际上在 DB2 V9.7 之前的版本中,正是通过该注册表变量提供了“当前已落实”的部分功能。如果启用“当前已落实”设置(扫描将直接跳过未提交的读),那么这个注册表变量无效。如果 DB2_SKIPINSERTED 设置成 OFF,则并不会使得“当前已落实”的跳过未提交读的功能失效。需要注意,“当前已落实”的跳过未提交读的行为在所有的 CS/RS 扫描中是有效的,除非将“当前已落实”改成别的值。
(2)DB2_SKIPDELETED
当该变量启用时,将允许 CS / RS 扫描跳过未提交的删除行和索引键(index updates = delete + insert) 。在早期 DB2 版本中 DB2_SKIPDELETED 生效时,未提交的已删除行将被跳过,但是更新和插入行还会导致锁等待。在 DB2 V9.7 中,这个参数被设置生效后,同时“当前已落实”也有效的情况下,未提交的已删除行将不再跳过(而是使用 Currently Committed version 替代进行运算)。但是,当“当前已落实”不可用时,未提交的已删除行还是会被跳过。
(3)DB2_EVALUNCOMMITTED
当该变量启用时,将允许 CS / RS 扫描对未落实的数据进行谓词求值。
带来的影响是,它将进行表或索引访问扫描以延迟或避免行锁定(扫描时使用 UR),直到知道数据记录满足谓词求值为止。
下面我们解释几个名词的含义:
(1)隐式“当前已落实”:
是指当数据库上的“当前已落实”设置启用,而请求没有显式的请求“当前已落实”(也就是数据库配置参数 CUR_COMMIT=ON,而且请求没有通过 BIND 或 PREP 命令将 CONCURRENTACCESSRESOLUTION 选项设置成 USE CURRENTLY COMMITTED 或 WAIT FOR OUTCOME)。
(2)显式“当前已落实”:
是指程序包中的语句通过 BIND 或 PREP 命令显式的请求“当前已落实”(通过 BIND 或 PREP 命令将 CONCURRENTACCESSRESOLUTION 选项设置成 USE CURRENTLY COMMITTED)。
(3)“等待运行结果”(Wait For Outcome):
是指程序包中的语句通过 BIND 或 PREP 命令显式的发出“等待运行结果”请求(通过 BIND 或 PREP 命令将 CONCURRENTACCESSRESOLUTION 选项设置成 WAIT FOR OUTCOME)。
在游标稳定隔离级别(CS)下的所有只读操作,不管其使用了隐式“当前已落实”还是显式“当前已落实”,DB2_SKIPINSERTED 注册表变量都不适用,因为“当前已落实”已经包含了该功能,而 DB2_SKIPDELETED 和 DB2_EVALUNCOMMITTED 注册表变量也将无效,具体如表格 4 中第二列所示。
在游标稳定隔离级别(CS)下的所有写操作和读稳定性隔离级别(RS)所有读 / 写操作,当其使用了隐式“当前已落实”时,DB2_SKIPINSERTED 注册表变量都不适用,因为“当前已落实”已经包含了该功能,而 DB2_SKIPDELETED 和 DB2_EVALUNCOMMITTED 注册表变量将继续有效,具体如表格 4 中第三列所示。
在游标稳定隔离级别(CS)下的所有写操作和读稳定性隔离级别(RS)所有读 / 写操作,当其使用了显式“当前已落实”时,DB2_SKIPINSERTED 注册表变量都不适用,因为“当前已落实”已经包含了该功能,而 DB2_SKIPDELETED 和 DB2_EVALUNCOMMITTED 注册表变量也将无效,具体如表格 4 中第四列所示。
在游标稳定隔离级别(CS)下的所有读 / 写操作和读稳定性隔离级别(RS)所有读 / 写操作,当其使用了“等待运行结果”(Wait For Outcome)时,DB2_SKIPINSERTED、DB2_SKIPDELETED 和 DB2_EVALUNCOMMITTED 注册表变量都将无效,具体如表格 4 中第五列所示。
| 注册表变量 | 隐式“当前已落实”; 显式“当前已落实”; CS 只读操作; | 隐式“当前已落实”; CS 写操作; RS 读 / 写操作; | 显式“当前已落实”; CS 写操作; RS 读 / 写操作; | Wait For Outcome ; CS 或 RS 下的读写操作; |
|---|---|---|---|---|
| DB2_SKIPINSERTED | 不适用(当前已落实已经包含该功能) | 不适用(当前已落实已经包含该功能) | 不适用(当前已落实已经包含该功能) | NO |
| DB2_SKIPDELETED | NO(不适用) | YES | NO | NO |
| DB2_EVALUNCOMMITTED | NO(不适用) | YES | NO | NO |