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

时间:2019-03-14 15:28:39

标签: sql-server msdtc

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

我在服务器A上有两个存储库,它们执行相同的操作,即从API(相同的API)获取数据,并最终将其插入到服务器B上的表中。一个存储库将所有功能包装在try /中。捕获块,一切正常。第二个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.

我在没有交易的情况下对其进行了测试,尽管我更喜欢在其中进行交易,但它似乎工作得很好。经过一番研究,我遇到了一个设置,在理解其效果之前我有些犹豫。

  

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

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

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

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

2 个答案:

答案 0 :(得分:3)

链接服务器存在的一个关键原因是使DBA /管理员能够明确限制给定SQL Server与它可能与之交互的任何其他Box /服务之间可能进行的连接和活动(鉴于某些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(“我的车库中的盒子上的远程表”,在此切换)FROM dbo.SuperSensitiveInfo ”,并将敏感数据“流式传输”到AD HOC端点)。

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

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

以该“思维方式”为背景,远程proc交易促进表示可以针对存在链接服务器 IF 的链接服务器启用(提升,禁用或取消禁用)的高级“权限”那里有足够的信任。

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

否则,我相信您可以/可以通过按以下步骤在OS /服务器级别本身启用网络DTC,从而绕过SQL Server的其他限制(针对DTC成为默认)。 https://support.resolver.com/hc/en-ca/articles/207161116-Configure-Microsoft-Distributed-Transaction-Coordinator-MSDTC-

答案 1 :(得分:0)

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

enter image description here