小编Ste*_*idi的帖子

为什么我的 MERGE 查询在序列化隔离级别事务中死锁?

我试图避免我的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]。 …

deadlock merge sql-server-2014

5
推荐指数
1
解决办法
1667
查看次数

标签 统计

deadlock ×1

merge ×1

sql-server-2014 ×1