【问题标题】:TSQL - Distributed or Local Transaction?SQL - 分布式或本地事务?
【发布时间】: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 中编码时,我如何知道我是处于分布式事务中还是处于本地事务中? 如果我处于分布式事务中,我将不会执行回滚语句。

任何帮助将不胜感激。

【问题讨论】:

  • 也许这个帖子可以帮到你,希望不会太老stackoverflow.com/questions/2919018/…
  • 另外,我不知道你有多少这样的 SP,但你可以在每个 SP 中都有一个参数来指示你是否应该回滚
  • @MSANZ 谢谢,我已经访问过这个线程,但它对分布式事务没有帮助。它只能说非隐式-显式事务模式。关于为每个 SP 添加一个参数,实际上是不可能的,因为 SP 的数量巨大,并且因为 SP 对其他 SP 进行后续调用。我不知道调用事务解除 SP 的路径,因此我必须将参数添加到所有 SP 并将值传播到所有后续调用。
  • 另一种不优雅的方法是检测哪个应用程序启动了会话:SELECT client_interface_name FROM sys.dm_exec_sessions 并做出相应的反应。
  • 那些投反对票和投赞成票的可以解释一下原因吗?

标签: sql sql-server tsql msdtc


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 2015-02-10
    • 2015-10-04
    • 2011-07-20
    • 1970-01-01
    • 2012-08-31
    • 2017-04-06
    相关资源
    最近更新 更多