我在特定端点中有几个消息处理程序,它们针对SQL Azure数据库(目前仍在使用本地SQL 2012实例)进行工作。我有一个命令处理程序,它发布了2个事件,称之为X和Y.在同一个端点,我有一个X的订阅者和Y的订阅者。这两个订阅者都在内部使用相同的数据访问组件,称之为Z. Dependency注入是基于每个呼叫配置的,不是共享的。
组件Z正在窗帘下使用Entity Framework 6。我遇到的问题是,只是打开数据库就会抛出SqlException并抱怨MSDTC升级。
我已暂时将处理程序包装在TransactionScope.Suppress中并且已经停止了错误,但我相信我错过了一些更基本的东西。
将端点配置为非事务性是否是一件简单的事情?我原本以为这会工作,因为我已经配置为使用Azure Service Bus作为传输机制。如果我这样做,如果在消息处理程序中抛出异常,NServiceBus是否仍会重试? (直到SLR限制 - 不是问题的一部分,我也理解幂等问题)。
答案 0 :(得分:0)
@Phil,
首先,您不应该将MSDTC与SQL Azure一起使用 - 它不受支持。建议使用此功能,但仅限under review。 Azure不支持DTC。或者,您可以查看following suggestion以使用SqlTransaction方法。
其次,您正在使用的传输与您的数据访问无关。由于您使用的是Azure Service Bus,因此它不会成为处理程序代码的一部分。使处理程序成为事务处理是强制进行原子更改或回滚。无论您的处理程序如何,都将重试。挑战是当处理程序/端点不是事务性的,并且在处理程序内首先写入DB成功并且第二次失败时,首先写入不会被还原。至于Azure Service Bus作为传输,它本质上不是事务性的(即没有DTC)。
答案 1 :(得分:0)
您使用的是哪个版本的NServiceBus.Azure?你有异常的堆栈跟踪吗?它来自哪里?
我们明确地推送发送并发布接收事务范围的范围以防止升级到DTC,以便事务是sql的本地事务,所以我怀疑这是发生了什么。
从您的描述看起来,您正在为每个处理程序(每个调用容器配置)使用不同的数据访问实例,并且您在同一消息上有多个处理程序。如果这两个都打开了与SQL的新连接,您也会看到促销(即使它是同一个服务器)
难道不是吗?它会在第二次打开时抛出?