Отключить DTC в службе WCF (MSMQ) - PullRequest
3 голосов
/ 20 июля 2011

Я использую конечную точку MSMQ. Я установил следующие атрибуты для моего сервиса.

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

На интерфейсе у меня есть

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

У меня есть метод, который делает обновление базы данных сервера SQL, и MSDTC всегда используется, и транзакция повышается.

Как мне это подавить. Как мне установить соединение с сервером sql, который находится в полностью ОТДЕЛЬНОЙ транзакции для транзакции MSMQ. Я хочу только транзакцию sql, а не транзакцию DTC. Есть ли способ убедиться, что транзакция sql не включена в область транзакции MSMQ.

Я надеюсь, что смогу сделать это без полного удаления транзакций в MSMQ, о чем я и думаю.

Привет

Craig

1 Ответ

6 голосов
/ 20 июля 2011

Вы жалуетесь на основное значение транзакционного MSMQ. Транзакционный MSMQ использует транзакционное чтение и запись в очередь. Таким образом, ваше сообщение читается в транзакции, и если его чтение / обработка не удается прочитать, выполняется откат, и сообщение не удаляется из очереди. Помечая вашу операцию TransactionScopeRequired, вы сообщаете WCF, что ваша операция является частью транзакционной обработки сообщения . Если ваша база данных потерпит неудачу, она также не сможет прочитать MSMQ, и ваше сообщение не будет потеряно. Если вы откроете соединение с базой данных в своей операции, транзакция будет переведена в DTC, потому что у вас есть два транзакционных ресурса в одной транзакции.

Так что, если вы не хотите использовать этот механизм, не используйте транзакционную очередь, но тщательно обдумайте это. Причиной отключения транзакционной очереди должно быть то, что она вам не нужна, а также то, что вам не нужны распределенные транзакции.

...