我有一个存储过程,其执行以下操作:行锁选择
- 从表中进行选择前N
- 将这些行作为处理
- 返回这些行到客户端
这里大概是我在Sybase ASE中如何做的:
set rowcount @count
begin tran get_items
insert into #temp_table
select item
from available_item
where is_processed = 0
update available_item
set is_processed = 1
from available_item, #temp_table
where available_item.item = #temp_table.item
# select the processed items...
commit trans
我想知道这里是否有比赛条件。如果两个单独的进程同时执行此存储过程,他们是否可以选择并标记处理相同的数据?还是在交易中阻止它?
如果没有,是否有办法锁定选定的行上?
您好,感谢您的信息。我已经尝试在select insert查询下面的隔离2处添加,但是得到以下错误:'错误:SELECT INSERT不能用隔离级别子句指定。“你知道如何解决这个问题吗? – sam
对不起,我错过了。您不能在select into处使用'isolation'。使用会话级别设置:'set transaction isolation level 2' - 我已经更新了答案。 –