我正在使用 MSMQ 端点。 我在我的服务上设置了以下属性。
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void MyMethod(MyParam param) { ... }
在我的界面上
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, ReleaseServiceInstanceOnTransactionComplete = true)]
我有一个更新 sql server 数据库的方法,并且始终使用 MSDTC 并提升事务。
我如何抑制它。如何连接到与 MSMQ 事务完全独立的事务中的 sql server。我只想要 sql 事务,而不是 DTC 事务。有什么办法可以保证sql事务不被包含在MSMQ事务的范围内。
我希望我可以在不完全删除 MSMQ 上的事务的情况下执行此操作,这正是我正在考虑的。
问候
克雷格
最佳答案
您在提示事务性 MSMQ 的核心含义。事务性 MSMQ 使用事务性读取和写入队列。因此,您的消息在事务中被读取,如果其读取/处理失败,读取将回滚并且消息不会从队列中删除。通过使用 TransactionScopeRequired
标记您的操作,您告诉 WCF your operation is part of message's transactional processing .如果您的数据库操作失败,MSMQ 读取也会失败,并且您的消息不会丢失。如果您在操作中打开数据库连接,事务将被提升为 DTC,因为您在单个事务中有两个事务资源。
因此,如果您不想要这种机制,请不要使用事务队列,但请仔细考虑。关闭事务队列的原因应该是你不需要它而不是你不想要分布式事务。
关于wcf - 在 WCF (MSMQ) 服务中禁用 DTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6761290/