我在“2012 (SP3)”数据库中有一些SPs。这些SPs可以从VB6应用程序和其他SPs调用,也可以从.Net应用程序调用。
如果从其他SPs或VB6应用程序调用SP,我可以回滚当前事务,并在出现错误/无效输入时使用raiserror提供正确的错误消息。
但是,由于.Net应用程序打开的连接被连接到分布式事务(如果涉及多个WCF服务)(这是一个公司标准,我们使用MS ),所以我不应该回滚事务,我应该只调用raiserror命令。
如果回滚分布式事务,使用raiserror命令引发的所有错误消息都会丢失,而在.Net端则会得到一个异常,其消息是:
Microsoft分布式事务协调器(MS DTC)取消了分布式事务。
如何知道我是在分布式事务中,还是在SPs?中编码时在本地事务中,如果我在分布式事务中,我将不会执行rollback语句。
任何帮助都将不胜感激。
发布于 2016-06-09 10:32:29
对于那些面临同样问题的人,我找到了一个暂时的解决方案:
我正在检查sys.dm_tran_session_transactions视图。
如果我来自is_enlisted,并且在.Net端启动msdtc事务,那么列.Net就成为真。
编辑:视图sys.dm_pdw_nodes_tran_session_transactions用于azure数据库(我认为群集安装也可能有效),其他版本也使用sys.dm_tran_session_transactions。所以我编辑了答案来使用sys.dm_tran_session_transactions
https://stackoverflow.com/questions/37455307
复制相似问题