TSQL - 分布式或本地事务?

时间:2016-05-26 08:20:26

标签: sql sql-server tsql msdtc

我在" 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内进行编码时本地交易?如果我在分布式交易中,我不会执行回滚语句。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

对于那些遇到同样问题的人,我找到了一个临时解决方案:

我正在检查sys.dm_tran_session_transactions视图。

如果我来自.Net并且我在.Net方面开始了一个msdtc事务,那么is_enlisted列就会成立。

编辑:视图sys.dm_pdw_nodes_tran_session_transactions用于azure sql数据库(我认为这在群集安装中也可能有效),而sys.dm_tran_session_transactions用于其他版本。所以我编辑了使用sys.dm_tran_session_transactions

的答案