SQL - 分布式或本地事务?
Posted
技术标签:
【中文标题】SQL - 分布式或本地事务?【英文标题】:TSQL - Distributed or Local Transaction? 【发布时间】:2016-05-26 08:20:25 【问题描述】:我在“Microsoft SQL Server 2012 (SP3)”数据库中有一些 SP。 这些 SP 可以从 VB6 应用程序和其他 SP 调用,也可以从 .Net 应用程序调用。
如果从其他 SP 或 VB6 应用程序调用某个 SP,我可以回滚当前事务并使用 raiserror
给出正确的错误消息,以防出现错误/无效输入。
但由于 .Net 应用程序打开的连接与 分布式事务 如果涉及多个 WCF 服务(这是公司标准,我们使用 MS DTC)我应该不回滚事务,我应该只调用raiserror
命令。
如果我们回滚分布式事务,使用raiserror
命令引发的所有错误消息都会丢失,并且在.Net 端我们会收到一个异常消息:
Microsoft 分布式事务协调器 (MS DTC) 具有 取消分布式事务
在 SP 中编码时,我如何知道我是处于分布式事务中还是处于本地事务中? 如果我处于分布式事务中,我将不会执行回滚语句。
任何帮助将不胜感激。
【问题讨论】:
也许这个帖子可以帮到你,希望不会太老***.com/questions/2919018/… 另外,我不知道你有多少这样的 SP,但你可以在每个 SP 中都有一个参数来指示你是否应该回滚 @MSANZ 谢谢,我已经访问过这个线程,但它对分布式事务没有帮助。它只能说非隐式-显式事务模式。关于为每个 SP 添加一个参数,实际上是不可能的,因为 SP 的数量巨大,并且因为 SP 对其他 SP 进行后续调用。我不知道调用事务解除 SP 的路径,因此我必须将参数添加到所有 SP 并将值传播到所有后续调用。 另一种不优雅的方法是检测哪个应用程序启动了会话:SELECT client_interface_name FROM sys.dm_exec_sessions 并做出相应的反应。 那些投反对票和投赞成票的可以解释一下原因吗? 【参考方案1】:对于遇到同样问题的人,我找到了一个临时解决方案:
我正在检查sys.dm_tran_session_transactions
视图。
如果我来自 .Net 并且如果我在 .Net 端启动了 msdtc 事务,则 is_enlisted
列变为 true。
编辑:视图sys.dm_pdw_nodes_tran_session_transactions
用于azure sql 数据库(我认为这在集群安装中也可能有效),sys.dm_tran_session_transactions
用于其他版本。所以我编辑了答案以使用sys.dm_tran_session_transactions
【讨论】:
以上是关于SQL - 分布式或本地事务?的主要内容,如果未能解决你的问题,请参考以下文章