【发布时间】:2017-10-06 19:52:01
【问题描述】:
我的声明:
SELECT ROW_ID DATA_T WHERE CITY_ID=2000 AND IS_FREE=0 AND ROWNUM = 1
用于检索具有许多 CITY_ID 等于 2000 的条目的 db 表的第一行。
然后在 UPDATE 语句中使用返回的 ROW_ID 以使用该行并设置 IS_FREE=1。
在两个线程调用 SELECT 语句并且显然得到相同的 ROW_ID 之前效果很好......这就是我的问题。
我正在使用 ORACLE DB (12.x)
我该如何解决这个问题?在这种情况下我可以使用 FOR UPDATE 吗?
我希望每个“客户”以某种方式获得不同的行或至少锁定其中的一行
【问题讨论】:
-
此链接可能会有所帮助:stackoverflow.com/questions/7523189/…
-
为什么不试试这里描述的模式:asktom.oracle.com/pls/apex/…
-
所以你说要“更新 DATA_T SET IS_FREE=1 where (SELECT ROW_ID DATA_T WHERE CITY_ID=2000 AND IS_FREE=0 AND ROWNUM = 1)
-
更像
UPDATE DATA_T SET IS_FREE=1 WHERE ROWID = (SELECT ROWID FROM DATA_T WHERE CITY_ID=2000 AND IS_FREE = 0 AND ROWNUM = 1) AND IS_FREE = 0 RETURNING ROWID INTO ridRowid_var。祝你好运。
标签: oracle