我在我的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 但是它很少失败,比如一天一次。这意味着数据存在于表中,@@rowcount为0,它试图插入数据和发生主键冲突。这里是插入ie的所有值。id、value1、value2等是整数。有什么想法吗?
发布于 2019-03-19 20:07:13
我不知道为什么要使用变量,但是您需要用一个事务保护多个语句。正在发生的情况是,两个用户同时调用这个过程,两个用户都得到了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;我在博客上写了这篇文章,因为我写了这个答案:
https://dba.stackexchange.com/questions/232558
复制相似问题