【发布时间】:2021-11-23 02:02:43
【问题描述】:
我有一个关于 IBM DB2 for z/OS 的 CURSOR 中的 FOR UPDATE 子句的问题。 假设隔离级别光标稳定性(BIND 命令中的标准参数)。 DB2 版本为 11。
我的第一个问题是:使用 FOR UPDATE 子句编码的 CURSOR 能否防止并发事务从读取 CURSOR 当前所在行的形式读取? 我的第二个问题是:UPDATE ... WHERE CURRENT OF ... 语句是否检测到在打开 CURSOR 之后和从 CURSOR 结果集中获取更新行之前何时更改了更新行?
我在网上阅读了一些关于这些问题的相互矛盾的陈述。 根据我(当前)的理解,FETCH 操作仅在获取的行上获取更新锁,因此并发事务至少可以读取同一行。 U-Lock 仅在 UPDATE WHERE CURRENT OF CURSOR 实际完成的情况下才升级为 X-Lock(取决于应用程序逻辑)。但这让我感到困惑,因为它不会防止丢失更新现象(当允许并发进程在第一个进程中的更新完成之前读取值时,它会继续使用旧值进行处理并覆盖第一个进程的更新通过CURRENT OF CURSOR更新的进程)。
【问题讨论】:
标签: db2 locking database-cursor db2-zos select-for-update