wcf - 在 WCF (MSMQ) 服务中禁用 DTC

标签 wcf transactions msmq

我正在使用 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/

相关文章:

java - 如何在EJB中提交事务?

c# - 客户端不读取远程 MSMQ 队列,但可以发送到远程队列

msmq - 是否需要在本地计算机上安装 MSMQ 才能使用远程队列?

wcf - .net WCF - CXF/WSS4j 互操作性

wcf - 在为 WCF REST 服务的自定义(反)序列化实现 IDispatchMessageFormatter 时如何读取 Message 对象的主体?

WCF 和 WSE 2.0 网络服务

asp.net-core - ASP.NET Core 1.0 中无法访问 System.Messaging/MSMQ

visual-studio-2008 - 单元测试DAL-运行单元测试时停止连接

php - 如何将信用卡付款整合到我的网站?

ios - 添加和删​​除事务队列观察器 - 正确的方法?