我试图避免我的MERGE查询出现死锁,它可能被不同的线程调用,并且可能在执行过程中使用相同的参数重叠。我对这个查询的体验与这个问题中描述的场景非常相似,我在下面列出了查询以供参考。
CREATE PROCEDURE MergeIt
@dataToMerge MyTableType READONLY
AS
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET XACT_ABORT ON;
BEGIN TRANSACTION
MERGE INTO TargetTable WITH(HOLDLOCK) AS [target]
USING @dataToMerge AS [source]
ON [source].KeyPart_1 = [target].KeyPart_1 AND
[source].KeyPart_2 = [target].KeyPart_2
WHEN NOT MATCHED THEN
INSERT(Data, KeyPart_1, KeyPart_2)
VALUES([source].Data, [source].KeyPart_1, [source].KeyPart_2)
WHEN MATCHED THEN
UPDATE SET [target].Data = [source].Data,
[target].KeyPart_1 = [source].KeyPart_1,
[target].KeyPart_2 = [source].KeyPart_2;
COMMIT TRANSACTION
RETURN 0
Run Code Online (Sandbox Code Playgroud)
TargetTable具有作为主键的标识列,并且对[KeyPart_1, KeyPart_2]列元组具有唯一性约束。 MyTableType具有类似于列元组的架构,TargetTable并且还定义了一个主键[KeyPart_1, KeyPart_2]。 …