我在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个参数的单个更新查询。