Sql 如何防止此竞争条件插入重复记录?
我有一个简单的存储过程,可以使用相同的Sql 如何防止此竞争条件插入重复记录?,sql,sql-server,azure-sql-data-warehouse,Sql,Sql Server,Azure Sql Data Warehouse,我有一个简单的存储过程,可以使用相同的@param1值快速连续调用多次 create proc Example(@param1 int, @param2 int, @param3 int) as if exists(select 1 from dbo.mytable where col1 = @param1) begin update dbo.mytable set col2 = @param2, col3 = @param3 where col1 = @param1
@param1
值快速连续调用多次
create proc Example(@param1 int, @param2 int, @param3 int)
as
if exists(select 1 from dbo.mytable where col1 = @param1)
begin
update dbo.mytable
set col2 = @param2, col3 = @param3
where col1 = @param1
end
else
begin
insert into dbo.mytable(col1, col2, col3) values(@param1, @param2, @param3)
end
因此,我们看到插入了重复记录。我知道需要将主键/唯一约束添加到col1
,这将保持数据干净,但我仍然需要防止发生错误
如果插入已在进行,如何强制后续调用等待并更新?将其包装在事务中是否有帮助,或者我是否需要添加某种表或行锁
更新
我不能使用
MERGE
,因为我们的数据仓库不支持它。而且,尽管正如评论中所指出的,它处于预览状态,但wBob提供的链接显示,MERGE
在不改变事务隔离级别的情况下也会有同样的问题。不幸的是,数据仓库不支持该隔离级别或表提示。@MatBailie,这是一个数据仓库。不幸的是,MERGE
不受支持。请将它们放在您的进程中!?合并不会有帮助,非常确定合并处于预览状态:@wBob,如果我正确读取MatBailie的链接,merge
如果不使用数据仓库不支持的隔离级别,仍然无法正常工作:(