Microsoft DTC 不能很好地处理存储过程中的事务

Microsoft DTC not playing nice with a transaction in a sproc

我 运行 遇到 DTC 对我不好的问题。我有两台服务器,我们称之为服务器A和服务器B(不同版本,不同物理机,相同域,相同网络)。

我在服务器 A 上有两个存储过程,它们执行相同的操作,即从 API(相同的 API)获取数据并最终将其插入服务器上的 table B. 一个 sproc 的所有功能都包含在 try/catch 块中,并且一切正常。第二个 sproc 做同样的事情,将所有 "try" 内容添加到事务中(这样我就可以在出现问题时回滚)。这会导致错误 - 如下所示。

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.

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

link to the article: https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-serveroption-transact-sql?view=sql-server-2017
setting in question: remote proc transaction promotion

我将其设置为以下代码,我将在 运行 跨服务器插入之前将其翻转到 "off" 位置,然后将其重新打开(是默认设置)完成后。

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

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

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

链接服务器存在的一个关键原因是使 DBAs/Admins 能够明确限制给定 SQL 服务器和它所连接的任何其他 box/service 之间可能存在的连接和活动类型可能能够与之交互(考虑到 SQL 服务器附带的一些库和 built-in 功能,以帮助 'cross' 平台和 cross-host 通信)。

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

默认情况下,不允许 ad-hoc 分布式查询(防止某人有效地 运行 "SELECT * INTO OPENDATASOURCE('my remote table on a box in my garage', switches, here) FROM dbo.SuperSensitiveInfo" 和 'streaming' 敏感数据到 AD HOC 端点).

或者,换句话说,链接服务器不是 'just' 来建立连接 simpler/easier(通过将它们 1x 定义为 commonly-mapped 端点,这样更容易查询 OPEN* () 操作)但是 DBAs/Admins 可以 'signal' 这些端点具有一定程度的信任度,足以让管理员明确地创建连接。

所有这些都是说:链接服务器存在的一个关键原因是帮助 'define' 保护给定 SQL 服务器可能与之通信的端点 - 以及在哪些条件下(即,什么是允许的,什么是不允许的)。因此,从这个意义上说,链接服务器有点像将 child 交给 smart-phone,他们只能使用 phone 应用程序,并且不允许拨打任何号码 -但只能呼出您定义的联系人 - 这样他们就可以与朋友交谈并给您打电话,但不能拨打任何 'ad hoc' 电话。

以 'mindset' 为背景,远程 proc 事务提升表示可以针对链接服务器 IF那里有足够的信任。

或者,换句话说,如果您信任 ServerA 和 ServerB 之间的关系,并且您同意他们一起玩 DTC-footsie,那么我将设置(和 'forget')此链接服务器设置INSTEAD 切换它 before/after 这个特定的 sproc 被启用。

否则,我相信您 can/could 只需按照以下步骤在 OS/Server-Level 本身启用网络 DTC 即可在此处绕过 SQL 服务器的额外限制(反对 DTC 作为默认登记)这些: https://support.resolver.com/hc/en-ca/articles/207161116-Configure-Microsoft-Distributed-Transaction-Coordinator-MSDTC-