在WCF(MSMQ)服务中禁用DTC

时间:2011-07-20 11:40:54

标签: wcf transactions msmq

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

[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void MyMethod(MyParam param) { ... }

在我的界面上

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, ReleaseServiceInstanceOnTransactionComplete = true)]

我有一个方法可以更新sql server数据库,并且总是使用MSDTC并且提升事务。

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

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

此致

克雷格

1 个答案:

答案 0 :(得分:6)

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

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