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)
自从写了这个答案后,我就在博客上写了这篇文章:
归档时间: |
|
查看次数: |
488 次 |
最近记录: |