如何在 IBM Db2 中锁定更新行而不超时?



我需要在 zos 上的 ibm db2 中为每个连接更新一行,而不会出现数据异常。

我选择使用 rs 进行更新并使用 KEEP 语句,但存在问题。如果一个客户端在数据更新期间保持锁定,同时第二个用户尝试读取同一行 - 第二个用户将等待锁定被释放。

我需要下一个行为:如果锁下的行,第二个用户会收到错误。

在 DB2 11 中可能吗?

您要求的是一个条件选择,如果我正确阅读您的请求,您可以获得 UPDATE 锁。 我不认为有办法做到这一点。 但是,您可以执行以下操作的替代方法:

SELECT myCount FROM myTable WHERE ID = someValue

然后,您可以更新该值并使用 WHERE 子句执行 UPDATE,该子句查找 myCount 的 ID 和原始值。 像这样的序列

SELECT myCount FROM myTable WHERE ID = someValue
origCount = myCount++
UPDATE myTable WHERE ID = someValue AND myCount = origValue

如果您的 UPDATE 显示更新了零行,则表明其他人更新了它,然后您重复该序列或继续执行备用逻辑。

我相信这将实现您正在寻找的内容,而无需检测锁的存在,因为您指示一次访问一行,您可以使用 CS 隔离。

这通常称为乐观并发

乐观并发控制 (OCC( 是一种并发控制方法 应用于事务系统,如关系数据库 管理系统和软件事务内存。OCC 假设 多个事务可以频繁地完成而不会干扰 彼此。运行时,事务使用的数据资源没有 获取这些资源的锁。在提交之前,每个 事务验证没有其他事务修改了数据 它已经阅读。如果检查显示冲突的修改,则 提交事务将回滚并可以重新启动。[1] 乐观 并发控制最早是由H.T. Kung和John T提出的。 罗宾逊

更新一条记录的时间很长,也许最好只读取包括时间戳在内的记录,然后处理其他记录。 准备好更新时,读取以进行更新,如果时间戳未更改,则更新记录。 如果时间戳已更改,则显示错误。

最新更新