Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何防止此竞争条件插入重复记录?_Sql_Sql Server_Azure Sql Data Warehouse - Fatal编程技术网

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
如果不使用数据仓库不支持的隔离级别,仍然无法正常工作:(