在WCF(MSMQ)服务中禁用DTC

Jim*_*Jim 3 wcf msmq transactions

我正在使用MSMQ端点.我在我的服务上设置了以下属性.

[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void MyMethod(MyParam param) { ... }
Run Code Online (Sandbox Code Playgroud)

在我的界面上

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, ReleaseServiceInstanceOnTransactionComplete = true)]
Run Code Online (Sandbox Code Playgroud)

我有一个方法,它更新sql server数据库,并始终使用MSDTC并提升事务.

我该如何压制这个.如何连接到MSMQ事务的完全SEPARATE事务中的sql server.我只想要一个sql事务,而不是DTC事务.有没有办法确保sql事务不包含在MSMQ事务的范围内.

我希望我能做到这一点,而不是在MSMQ上完全删除交易,这正是我正在考虑的问题.

问候

克雷格

Lad*_*nka 6

您在抱怨交易MSMQ的核心含义.事务性MSMQ使用事务性读取和写入队列.因此,您的消息将在事务中读取,如果其读取/处理失败,则会回滚读取并且不会从队列中删除消息.通过标记您的操作TransactionScopeRequired告诉WCF 您的操作是消息的事务处理的一部分.如果您的数据库操作失败,它也将失败MSMQ读取并且您的消息不会丢失.如果您在操作中打开数据库连接,则事务将被提升为DTC,因为您在单个事务中有两个事务资源.

因此,如果您不希望此机制不使用事务性队列,请仔细考虑它.关闭事务性队列的原因应该是您不需要它而不是您不希望分布式事务.

  • 很遗憾我正在更新队列处理中的数据库.如果我使用文件io或其他一些机制,我可以自己保持一致性.对于读取此内容的任何其他人,请注意您实际上可以使用新的TransactionScope(TransactionScopeOption.Suppress)来抑制队列方法中的事务,这将允许您在没有事务的情况下更新数据库. (4认同)