如果不存在则插入以避免竞争条件

时间:2018-06-04 20:37:04

标签: sql-server tsql

如何确保以下陈述没有竞争条件?

for($i=0;$i<(int)$links->size()+0;$i++){}

这够了吗

for($i=0;$i<(int)(string)$links->size()+0;$i++){}

2 个答案:

答案 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)