如何获取或请求“当前已落实”
可以通过配置数据库配置参数 CUR_COMMIT 获取“当前已落实”或者通过 BIND / PRECOMPILE/PREP 命令对其 CONCURRENTACCESSRESOLUTION 子句指定 USE CURRENTLY COMMITTED 或 WAIT FOR OUTCOME 来请求“当前已落实”。
一、数据库配置参数 cur_commit
该数据库配置参数主要是用来控制游标稳定性扫描的行为,默认值为 ON,可选值为:
(1)ON :打开;
对于新创建的数据库,默认值是 ON,在此情况下,当你试图读取一个正在被其他应用程序修改的行时,将直接返回该行的当前已落实版本数据(也就是首次更改之前的值)。
(2)AVAILABLE:可用;
此值表示你的应用需要显式地请求“当前已落实行为”才能得到“当前已落实”结果。
(3)DISABLED:禁用;
如果数据库是从之前的版本升级而来,这个参数将被设置成 DISABLED,这是为了和以前版本的行为保持一致。如果你希望使用当前已落实来控制游标稳定性扫描的行为,需要将这个参数更改成 ON 。
需要注意的是,注册表变量 DB2_EVALUNCOMMITTED、DB2_SKIPDELETED 和 DB2_SKIPINSERTED 在启用 cur_commit 参数后会受到影响。在绑定(BIND)或预编译(PRECOMPILE)时对 CONCURRENTACCESSRESOLUTION 选项指定 USE CURRENTLY COMMITTED 或 WAIT FOR OUTCOME,那么注册表变量 DB2_EVALUNCOMMITTED、DB2_SKIPDELETED 和 DB2_SKIPINSERTED 将被忽略。
二、BIND 和 PRECOMPILE/PREP 的命令 CONCURRENTACCESSRESOLUTION 子句
BIND 和 PRECOMPILE/PREP 命令的 CONCURRENTACCESSRESOLUTION 子句主要是为了对程序包中的语句指定使用并行访问解析,语法结构如清单 3 所示:
清单 3. BIND 命令 CONCURRENTACCESSRESOLUTION 子句语法结构
>> - BIND - - filename - - - - - - - - - - - - - - - - - - - - - - - - - - >
> - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - >
' - CONCURRENTACCESSRESOLUTION - - + - USE CURRENTLY COMMITTED - + - '
' - WAIT FOR OUTCOME - - - - - - '
- - 清单 3 - 2 . PRECOMPILE/PREP 命令 CONCURRENTACCESSRESOLUTION 子句语法结构
>> - + - PRECOMPILE - + - - filename - - - - - - - - - - - - - - - - - - ->
' - PREP - - - - - - - '
> - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - >
' - CONCURRENTACCESSRESOLUTION - - + - USE CURRENTLY COMMITTED - + - '
' - WAIT FOR OUTCOME - - - - - - - ' |
该选项值表示:当数据处于更新或删除的过程中时,指定数据库管理器对扫描行为使用“当前已落实版本”,当行处于插入的过程中时这个设定将被跳过。当隔离级别处于游标稳定性或者读稳定性隔离级别时(对读稳定性隔离级别这个子句将只跳过未提交的插入操作)这个子句将有效,并且将忽略掉其他设置。
WAIT FOR OUTCOME
该选项值表示:当遇上数据正处于更新的过程中时,指定游标稳定性或更高的隔离级别扫描等待其提交或回滚完成。当行处于插入或删除的过程中时这些行在扫描时将不再被跳过。这个选项值将会造成 DB2_EVALUNCOMMITTED、 DB2_SKIPDELETED 和 DB2_SKIPINSERTED 不再生效。