分布式事务挂在更新sql server上

时间:2017-10-16 15:46:13

标签: sql-server transactions distributed

我在2台不同的服务器上更新4条不同的记录。我的问题是,如果我运行其中一个更新,当我运行查询时,分布式事务总是挂起并导致超时。我对锁定交易有点新意,因此很难找到解决方法。

这里有一些伪代码,因为我无法显示它。

BEGIN DISTRIBUTED TRANSACTION
    DECLARE @RecordID INT;
    SELECT @RecordID=ID FROM [RemoteServer].[CompanyData].[dbo].[OldRecords] WHERE CustomerNumber=@CustomerNumber AND ReportID=@ReportID;

    IF @RecordID IS NOT NULL
    BEGIN
        /* This is the offending update*/
        UPDATE [RemoteServer].[CompanyData].[dbo].[OldRecordInfo] SET /* bunch of parameters here */ WHERE RecordID=@RecordID;
        IF @@ERROR <> 0
        BEGIN
            ROLLBACK TRANSACTION;
            RETURN;
        END

        /* This one works fine */
                UPDATE [RemoteServer].[CompanyData].[dbo].[OldRecords] SET /* bunch of parameters here */ WHERE RecordID=@RecordID;
        IF @@ERROR <> 0
        BEGIN
            ROLLBACK TRANSACTION;
            RETURN;
        END
    END


 /* Do some more stuff */
COMMIT TRANSACTION;

任何更新OldRecordInfo表的调用都会导致整个进程挂起。它没有在任何其他表中引用,但OldRecords ID是主键和&amp; OldRecordsInfo的外键,以便两个记录具有相同的ID。如果我评论更新到oldrecords更新它仍然失败。更新上也没有触发器。我认为它与外键约束和锁定有关,但我有点不确定如何处理它。任何想法将不胜感激。

编辑: 因此,我可以通过向违规语句添加OPTION(RECOMPILE)来快速完成工作。在此之前,我让它运行20分钟,但它还没有完成。它是一个包含35个参数的单个更新查询。

0 个答案:

没有答案