检查@@ROWCOUNT 失败

blu*_*lue 4 sql-server primary-key locking

我在我的 SQL 程序之一中有一个类似于下面的代码,

declare @rowcount int

update table1
set value = @value
where id = @id

select @rowcount = @@ROWCOUNT

 if ( @rowcount = 0 )
 begin
    insert into table1(id, value1,value2...)
    select (@id, @value1, @value2...)
 end 
Run Code Online (Sandbox Code Playgroud)

但它很少失败,比如一天一次等。这意味着数据存在于表中,@@rowcount 为 0,它试图插入数据和主键冲突发生。这里插入的所有值,即。id、value1、value2 等是整数。有什么想法吗?

Aar*_*and 15

我不确定为什么要使用变量,但是您需要使用事务保护多个语句。发生的事情是两个用户同时调用该过程,都得到 rowcount = 0,然后他们都试图插入作为结果。

set transaction isolation level serializable;
begin transaction;

update dbo.table1
  set value = @value
  where id = @id;

if (@@ROWCOUNT = 0)
begin
  insert dbo.table1(id, value1,value2...)
    values(@id, @value1, @value2...);
end 

commit transaction;
Run Code Online (Sandbox Code Playgroud)

自从写了这个答案后,我就在博客上写了这篇文章: