【发布时间】: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