我的陈述:
<b>, <strong>, <i>, <em>, <br/>, <span>
用于检索具有多个CITY_ID等于2000的条目的db表的第一行。
然后在UPDATE语句中使用返回的ROW_ID,以便使用此行并设置IS_FREE = 1。
这很有效,直到两个线程调用SELECT语句并且显然得到了相同的ROW_ID ......这就是我的问题。
我使用的是ORACLE DB(12.x)
如何解决问题?在这种情况下我可以使用FOR UPDATE吗?
我想要每个&#34;客户&#34;以某种方式得到一个不同的行或至少锁定他们
答案 0 :(得分:1)
像这样的东西
function get_row_id return number
as
cursor cur_upd is
SELECT ROW_ID FROM TB WHERE CITY_ID=2000 AND IS_FREE=0 AND ROWNUM = 1
FOR UPDATE SKIP LOCKED;
begin
for get_cur_upd in cur_upd
loop
update TB
set IS_FREE = 1
where ROW_ID = get_cur_upd.ROW_ID;
commit work;
return get_cur_upd.ROW_ID;
end loop;
return null;
end;
更新后提交或不提交取决于您的逻辑。
此外,您可以在没有更新和提交的情况下返回row_id,稍后在func。
之外执行