【问题标题】:Microsoft DTC not playing nice with a transaction in a sprocMicrosoft DTC 不能很好地处理存储过程中的事务
【发布时间】:2019-03-14 15:28:39
【问题描述】:

我遇到了一个问题,即 DTC 不适合我。我有两台服务器,我们将它们称为服务器 A 和服务器 B(不同的版本、不同的物理机、相同的域和相同的网络)。

我在服务器 A 上有两个存储过程,它们执行相同的操作,即从 API(相同的 API)获取数据并最终将其插入服务器 B 上的表中。一个存储过程具有包装在 try/ 中的所有功能catch 块,一切正常。第二个存储过程与添加所有“尝试”内容的添加相同,这些内容包含在事务中(这样如果出现问题,我可以回滚)。这会导致错误 - 如下所示。

OLE DB provider "SQLNCLI11" for linked server "[Server B]" returned message "The partner transaction manager has disabled its support for remote/network transactions.".
Msg 7391, Level 16, State 2, Line 105
The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "[Server B]" was unable to begin a distributed transaction.

我在没有事务的情况下对其进行了测试,它似乎工作得很好,但我更愿意在其中进行事务。经过一些研究,我遇到了一个设置,在了解它的效果之前我有点犹豫要使用它。

文章链接https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-serveroption-transact-sql?view=sql-server-2017
有问题的设置:远程 proc 交易促进

我已将其设置为以下代码段,在运行跨服务器插入之前,我会将其翻转到“关闭”位置,然后在运行后将其重新打开(这是默认设置)完毕。

EXEC sp_serveroption 
     @server = '[Server B]'
    ,@optname = 'remote proc transaction promotion'
    ,@optvalue = 'false';

这是解决问题的正确方法吗?

【问题讨论】:

  • 视情况而定——你介意你不会能够“如果出现问题就回滚”吗? (或者更确切地说,回滚不会影响远程服务器上发生的任何事情?)在这里,对分布式事务(失败)的提升不是任意完成的。根据您正在做什么,代码可能会被重组,因此只有本地事务需要回滚。另一个真正需要考虑的选项是在服务器上启用 DTC,以便分布式事务工作。 (我知道这可能有点痛苦。)
  • @JeroenMostert 如果出现问题,我希望能够回滚远程服务器上发生的任何事情,但我想知道我提到的设置是否会抑制对 DTC 的提升(这似乎是导致问题的原因)。这是这个设置的作用吗?

标签: sql-server msdtc


【解决方案1】:

存在链接服务器的一个关键原因是使 DBA/管理员能够明确限制给定 SQL Server 和它可能能够与之交互的任何其他框/服务之间可能的连接和活动类型(假设某些SQL Server 附带的库和内置功能,以帮助“跨”平台和跨主机通信)。

有关这方面的更多背景信息,请注意禁用即席分布式查询的意图: https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/ad-hoc-distributed-queries-server-configuration-option?view=sql-server-2017

默认情况下,这是不允许临时分布式查询的(防止某人有效地运行“SELECT * INTO OPENDATASOURCE('my remote table on a box in mygarage', switch, here) FROM dbo.SuperSensitiveInfo "并将敏感数据“流式传输”到 AD HOC 端点)。

或者,换句话说,链接服务器不仅仅是为了使连接更简单/更容易(通过将它们定义为 1x 为更容易查询 OPEN*() 操作的通用映射端点),而是让 DBA /Admins 可以“发出信号”,表明这些端点具有足够的信任度与它们相关联,以便管理员显式创建连接。

所有这一切都是说:链接服务器存在的一个关键原因是帮助“定义”给定 SQL Server 可能与之通信的安全端点 - 以及在哪些条件下(即允许什么和不允许什么)。所以,从这个意义上说,Linked Servers 有点像给孩子一个智能手机,他们只能使用手机应用程序,并且不允许他们拨打任何号码 - 但只能呼叫你的联系人'已定义 - 以便他们可以与朋友交谈并给您打电话,但不能拨打任何“临时”电话。

以这种“思维方式”为背景,远程 proc 事务提升表示可以针对链接服务器启用(嗯,禁用或取消禁用)的 ELEVATED“权限”IF那里有足够的信任。

或者,换句话说,如果您信任 ServerA 和 ServerB 之间的关系,并且您可以与他们一起玩 DTC-footsie,那么我将设置(并“忘记”)此链接服务器设置而不是之前切换它/启用此特定存储过程后。

否则,我相信您可以/可以通过按照以下步骤在操作系统/服务器级别本身启用网络 DTC 来绕过 SQL Server 的附加限制(反对 DTC 登记作为默认值): https://support.resolver.com/hc/en-ca/articles/207161116-Configure-Microsoft-Distributed-Transaction-Coordinator-MSDTC-

【讨论】:

  • 不错。根据最后一个 URL,我需要让它工作的最后一块是启用防火墙规则: Inbound- Distributed Transaction Coordinator (RPC) Distributed Transaction Coordinator (RPC-EPMAP) Distributed Transaction Coordinator (TCP-In) Outbound- Distributed Transaction Coordinator (TCP-Out)
【解决方案2】:

今天对我有用,希望对你也有用:)

【讨论】:

  • 这是我发布的代码的视觉效果,感谢您分享您的经验。
猜你喜欢
  • 1970-01-01
  • 2010-09-12
  • 2011-12-24
  • 2022-12-18
  • 2012-06-01
  • 2017-03-29
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多