2010-08-12 3 views
4

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

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

я мог позволить MSDTC, но мой вопрос: где это Требование, исходящее, и я могу его удалить?

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

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

Благодаря

+3

Просто чтобы дополнить это сообщение, если кто-то ищет информацию по этому вопросу: NServiceBus имеет профиль InstallDtc, который можно использовать для автоматической настройки системы по мере необходимости. Может быть удобно для развертывания. –

ответ

4

MSDTC большое маленькое животное, но может быть весьма коварны.

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

Это, как говорится, ответ в том, что ORMs как NHibernate нет, но это вполне возможно, чтобы получить MSDTC, если принимать один из этих условий:

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

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

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

+0

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

+5

NServiceBus использует DTC для запуска вызовов базы данных и удаления сообщений из своей очереди ввода в том же tx. Тот факт, что подписки поступают в одну и ту же входную очередь, как и все другие сообщения, означает, что вам придется отказаться от поведения ACID для всех сообщений, настройте msmqtransport как не транзакционный для достижения этого, чтобы не использовать DTC.Тем не менее, способность гарантировать вышеуказанную согласованность - это ИМХО, одна из ключевых точек продажи NSB, поэтому предложит вам придерживаться транзакционных очередей и включить DTC –

+0

«Во-первых, я рекомендую, если вы знаете, что не хотите быть часть распределенной транзакции EVER, которую вы отключите на своих серверах разработки » Вы не можете по этому повод. – Paco

Смежные вопросы