如何在Ibm Db2中锁定行以进行更新而没有超时?

时间:2018-10-23 18:25:34

标签: sql database db2 mainframe zos

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

我选择FOR UPDATE WITH RS USE和KEEP语句,但是有问题。如果一个客户端在数据更新期间持有锁,而第二个用户同时尝试读取同一行,则第二个用户将等待直到锁被释放。

我需要下一个行为:如果行在锁下,则第二个用户将出错。

在DB2 11中可以吗?

2 个答案:

答案 0 :(得分:1)

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

SELECT myCount FROM myTable WHERE ID = someValue

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

之类的序列
SELECT myCount FROM myTable WHERE ID = someValue
origCount = myCount++
UPDATE myTable WHERE ID = someValue AND myCount = origValue

如果UPDATE显示已更新零行,则表明有人在更新它,然后您重复该序列或继续使用备用逻辑。

我相信这可以实现您想要的功能,而无需检测到锁的存在,因为您表示一次可以使用CS隔离来访问单个行。

通常称为Optimistic Concurrency

  

乐观并发控制(OCC)是一种并发控制方法   适用于关系数据库等交易系统   管理系统和软件事务存储。 OCC假设   多个交易可以经常完成而不会影响   彼此。在运行时,事务使用数据资源而无需   获取这些资源的锁。提交之前,每个   事务验证没有其他事务已修改数据   它已经阅读。如果检查显示有冲突的修改,则   提交的事务将回滚并可以重新启动。[1]乐观的   并发控制最初是由H.T.龚和约翰T.   鲁滨逊

答案 1 :(得分:0)

花很长时间更新一条记录,也许最好先读取包含时间戳记的记录,然后再处理其他记录。准备更新时,请阅读以进行更新,并且如果时间戳未更改,则更新记录。如果更改了时间戳,则显示错误。