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 - 分布式或本地事务?的主要内容,如果未能解决你的问题,请参考以下文章

Day431.本地事务&分布式事务&CAP理论 -谷粒商城

Day431.本地事务&分布式事务&CAP理论 -谷粒商城

Spring 事务相关

分布式事务?咱先弄明白本地事务再说 - ACID

事务分类与特性

分布式系统事务一致性