Microsoft DTC在sproc中的事务处理不好

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

我遇到了DTC不能和我玩得很好的问题。我有两台服务器,我们将其称为服务器A和服务器B(不同版本,不同物理机器,相同域和相同网络)。

我在服务器A上有两个sprocs,它们执行相同的操作,即从API(相同的API)获取数据并最终将其插入到服务器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.

我在没有交易的情况下测试了它,它似乎工作得很好,但我更愿意在那里进行交易。经过一些研究,我遇到了一个在理解其效果之前我有点犹豫不决的环境。

链接到文章: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';

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

sql-server msdtc
2个回答
3
投票

链接服务器存在的一个关键原因是使DBA / Admins能够明确地限制给定SQL Server与它可能能够与之交互的任何其他盒子/服务之间可以进行何种类型的连接和活动(给定一些库和SQL Server附带的内置功能,可帮助实现“交叉”平台和跨主机通信。

有关此问题的更多背景信息,请注意DISABLING临时分布式查询的用途: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端点。

或者,换句话说,链接服务器并不“简单”使连接变得更简单/更容易(通过将它们定义为一个常用映射端点,以便更容易查询OPEN *()操作)但是DBA / Admins可以'表示'这些端点具有足够的信任度,以便管理员明确地创建连接。

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

以“心态”为背景,远程proc事务促销代表一个ELEVATED'权限',可以对链接服务器启用(嗯,禁用或取消禁用),如果那里有足够的信任。

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

否则,我相信你可以/可以简单地绕过SQL Server附加限制(针对DTC登记作为DEFAULT),通过在OS / Server级别自身启用网络DTC,按照以下步骤:https://support.resolver.com/hc/en-ca/articles/207161116-Configure-Microsoft-Distributed-Transaction-Coordinator-MSDTC-


0
投票

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

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.