通过触发器更新链接服务器失败,但无需触发器即可工作。无法开始分布式事务

问题描述 投票:0回答:1

我在服务器 #1 上设置了 SQL 链接服务器来访问服务器 #2。 当我在服务器 #1 上的 SSMS 中运行更新或插入语句来更改服务器 #2 中的数据时,它会起作用。 现在我在表(服务器 #1 上)的触发器中使用完全相同的 UPDATE 语句,然后它失败并出现错误:

返回链接服务器“172.xx.xx.02”的 OLE DB 提供程序“SQLNCLI11” 消息“没有交易处于活动状态。”。消息 7391,16 级,状态 2, 过程 MyProc,第 12 行 操作无法执行,因为 链接服务器“172.xx.xx.02”的 OLE DB 提供程序“SQLNCLI11”为 无法开始分布式事务。

由于正常的 UPDATE/INSERT 正在工作,我将假设 DTC 设置正确并且工作正常(或者这是一个错误的假设?)。 由于网络上几乎所有帮助都涉及 DTC,因此我无论如何都会在下面粘贴我的 DTC 设置。还有什么可能吗? (在任何人批评链接服务器之前,是的,我知道它很旧,不是首选方式,但现在无法更改它 - 它是一个遗留系统)。

我的触发器看起来像这样:

ALTER TRIGGER [dbo].[MyTrigger]
  ON [dbo].[Table1]
  FOR UPDATE, INSERT
  AS
BEGIN 

INSERT INTO [172.xx.xx.02].SomeDB.dbo.MyTable (Field1, Field2)
VALUES ('34172', GETDATE())
END 

链接服务器属性:[enter image description here]1

故障码:

triggers linked-server msdtc
1个回答
0
投票

was unable to begin a distributed transaction
”:

如果链接服务器属性中的“

Enable Promotion of Distributed Transactions
”设置为 False,则可能是问题的原因。设置为 false 时,意味着 Microsoft SQL Server 将不会使用 Microsoft 分布式事务协调器 (MS DTC) 来协调分布在 SQL Server 多个实例中的事务。

尝试将“启用分布式事务推广”更改为True。
您可能需要重新启动 SQL 服务才能使更改生效。

除此之外,请尝试按照 Microsoft 官方页面进行操作:“使用 MSDTC 进行故障排除”。


如果将“

Enable Promotion of Distributed Transactions
”更改为
True
未能解决问题,并且 DTC 似乎设置正确,则可能有其他原因导致该行为。

触发器就其本质而言,在触发它们的操作范围内执行。如果外部操作(触发触发器的 INSERT 或 UPDATE)已经在事务内,然后触发器尝试执行分布式操作,这可能会出现问题。
考虑原始操作是否包含在事务中以及这是否可能是原因。

并确保在服务器 #1 和服务器 #2 上运行 SQL Server 的帐户具有足够的权限来启动分布式事务。

如果触发器影响多个数据库(即使在同一服务器上),SQL Server 可能会将事务提升为分布式事务。如果这些数据库中的任何一个是只读的或有其他一些限制,则可能会导致错误。


替代方法,作为解决方法(不一定是直接解决方案)

  • 您可以使用 Service Broker 将消息从一台服务器发送到另一台服务器,有效解耦操作并避免分布式事务的需要。
  • 您可以在服务器 #1 上的暂存表中累积更改,并让计划的 SQL 作业(通过 SQL 代理)定期将更改推送到服务器 #2,而不是使用触发器。
  • 在触发器中使用 TRY-CATCH 块来捕获任何异常并提供更多信息。
© www.soinside.com 2019 - 2024. All rights reserved.