如何确保以下陈述没有竞争条件?
for($i=0;$i<(int)$links->size()+0;$i++){}
这够了吗
for($i=0;$i<(int)(string)$links->size()+0;$i++){}
答案 0 :(得分:1)
是。足够了。将事务隔离级别设置为可序列化将在运行select时创建覆盖SomeId=@SomeId
的密钥锁定 - 这将阻止其他进程在事务运行时插入具有相同密钥(SomeId=@SomeId
)的值。
WITH(UPDLOCK)
提示将使SELECT在所选行上获得更新锁定(如果存在)。这将阻止其他事务在您的事务运行时修改这些行(如果它们在选择时存在)。
看起来您确实需要WITH(UPDLOCK)
提示,因为如果记录已经存在,您将立即提交交易。如果你想在提交之前做其他事情,如果记录确实存在,你可能需要这个提示 - 但实际上,你似乎没有。
答案 1 :(得分:0)
陈述是一项交易
declare @v int = 11;
insert into iden (val)
select @v
where not exists (select 1 from iden with (UPDLOCK) where val = @v)