我在" 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内进行编码时本地交易?如果我在分布式交易中,我不会执行回滚语句。
任何帮助都将不胜感激。
答案 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