我需要在zos上的ibm db2中为每个连接更新一行,而没有数据异常。
我选择FOR UPDATE WITH RS USE和KEEP语句,但是有问题。如果一个客户端在数据更新期间持有锁,而第二个用户同时尝试读取同一行,则第二个用户将等待直到锁被释放。
我需要下一个行为:如果行在锁下,则第二个用户将出错。
在DB2 11中可以吗?
答案 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隔离来访问单个行。
乐观并发控制(OCC)是一种并发控制方法 适用于关系数据库等交易系统 管理系统和软件事务存储。 OCC假设 多个交易可以经常完成而不会影响 彼此。在运行时,事务使用数据资源而无需 获取这些资源的锁。提交之前,每个 事务验证没有其他事务已修改数据 它已经阅读。如果检查显示有冲突的修改,则 提交的事务将回滚并可以重新启动。[1]乐观的 并发控制最初是由H.T.龚和约翰T. 鲁滨逊
答案 1 :(得分:0)
花很长时间更新一条记录,也许最好先读取包含时间戳记的记录,然后再处理其他记录。准备更新时,请阅读以进行更新,并且如果时间戳未更改,则更新记录。如果更改了时间戳,则显示错误。