Нужен ли MSDTC для NServiceBus / NHibernate? - PullRequest
4 голосов
/ 12 августа 2010

Я пишу решение NServiceBus и пытаюсь использовать DBSubcriptionStorage. Это использует NHibernate для доступа к данным, и я получаю следующее исключение:

Менеджер транзакций партнера отключил поддержку удаленных / сетевых транзакций

Я мог бы включить MSDTC, но у меня вопрос: откуда это требование и можно ли его удалить?

Я не знаком с NHibernate и не знаю, требует ли он MSDTC или NServiceBus. В базе данных подписки NServiceBus имеется только одна плоская таблица, и я едва ли вижу использование MSDTC в этом сценарии.

Могу ли я удалить требование MSDTC? Должен ли я написать свой собственный слой постоянства подписки для этой цели?

Спасибо

1 Ответ

4 голосов
/ 12 августа 2010

MSDTC - отличное маленькое животное, но может быть довольно коварным.

Прежде всего, я рекомендую, если вы знаете, что вы никогда не хотите быть частью распределенной транзакции, то включите ее.OFF на ваших серверах разработки.Вы не хотите автоматически переходить к распределенной транзакции в DEV только для того, чтобы узнать, что она убивает вашу производительность в реальном мире или не работает в производстве.

При этом ответом является то, что ORM какNHibernate нет, но очень возможно подключить MSDTC, если выполняется одно из следующих условий:

  • Вы запрашиваете представление / таблицу внутри транзакции, которая связана с другим сервером.
  • Вы используете два SqlConnections (или что-то еще, что использует NHibernate) в одном TransactionScope
  • Вы привлекаете другой транзакционный компонент (например, MSMQ или транзакционную файловую систему) внутри TransactionScope.

Если какое-либо из этих условий выполнено (наверняка есть и другие, о которых я забыл), ваша транзакция автоматически преобразуется в распределенную транзакцию, и MSDTC обязательно включается.Это означает, что MSDTC не только должен работать и настраиваться для вашего ящика, он должен быть настроен для всех ящиков, которые хотят участвовать в вашей транзакции.В простом сценарии SQL Serve это означает, что ваш сервер приложений и ваш SQL Server должны иметь его работающий и настроенный для распределенных транзакций.

Я не знаком с NServiceBus, но я склонен думать об этомбудет иметь все виды функциональности, которые будут транзакционно помещать сообщения, скажем, в очередь.

...