Как использовать TransactionScope в C #?

Я пытаюсь использовать TransactionScope , но продолжаю получать исключение ниже.
Приложение работает на другой машине, чем в базе данных, если это имеет значение. Я использую SQL Server 2005.

Доступ к сети для Диспетчера распределенных транзакций (MSDTC) отключен. Включите DTC для доступа к сети в конфигурации безопасности для MSDTC с помощью инструмента администрирования служб компонентов.

 using (TransactionScope tsTransScope = new TransactionScope()) { //Do stuff here tsTransScope.Complete(); } 

редактировать

Я сделал некоторые изменения, основанные на обратной связи. Теперь я получаю эту ошибку:

«Ошибка вызова HRESULT E_FAIL из вызова COM-компонента».
«Ошибка связи с основным менеджером транзакций».

Решение. Я думаю, что принятый ответ фиксировал начальную проблему, которую я получал. Вторая ошибка, по-видимому, специфична для Entity Framework. Я отправлю еще один вопрос.

Вот свойства на клиенте:
Клиент http://sofru.miximages.com/c%23/client.jpg

Вот свойства на сервере:
Сервер http://sofru.miximages.com/c%23/server.jpg

Необходимо включить доступ к сети DTC, как описано в этой статье Microsoft TechNet . Это изменение может потребоваться как на базе данных, так и на серверах приложений. Часто DTC уже включен на сервере базы данных, поэтому я сначала посмотрю на сервер приложений.

Вот скриншот того, что мы используем, за исключением опции «Разрешить удаленное администрирование»: Скриншот конфигурации безопасности

Я не столкнулся с проблемой HRESULT E_Fail, которую вы сейчас имеете, но эта статья о XP SP2, и у транзакций было это интересное предложение:

Другой параметр конфигурации, который вам нужно знать (хотя я считаю это необычным сценарием), это раздел реестра RestrictRemoteClients. Если значение этого ключа установлено равным 2 (RPC_RESTRICT_REMOTE_CLIENT_HIGH), то сетевые транзакции MSDTC не смогут работать должным образом. MSDTC поддерживает только значения RPC_RESTRICT_REMOTE_CLIENT_NONE (0) и RPC_RESTRICT_REMOTE_CLIENT_DEFAULT (1). Дополнительную информацию о RestrictRemoteClients см. На странице http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2netwk.mspx#XSLTsection128121120120 .

Наконец, хотя это не относится к вашей проблеме, очень важно отметить, что использование classа TransactionScope заключается в том, что его значением по умолчанию является использование уровня изоляции транзакций Serializable . Serializable является самым ограничивающим уровнем изоляции и, откровенно говоря, его удивительным, что он был выбран по умолчанию. Если вам не нужен этот уровень блокировки, я бы настоятельно рекомендовал установить уровень изоляции на менее ограничительный вариант (ReadCommitted) при создании экземпляра TransactionScope :

 var scopeOptions = new TransactionOptions(); scopeOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; scopeOptions.Timeout = TimeSpan.MaxValue; using (var scope = new TransactionScope(TransactionScopeOption.Required, scopeOptions)) { // your code here } 

Панель управления – Средства администрирования – Службы компонентов – Свойства моего компьютера – вкладка MSDTC – вкладка «Конфигурация безопасности» – сетевой доступ к DTC (отмечен) / Разрешить удаленные клиенты (отмечен) / Разрешить входящий (отмечен) / Разрешить исходящий (отмечен) / Включить транзакции TIP ( проверено)

Перезагрузите компьютер.

В зависимости от используемого вами бэкэнда TransactionScope часто требует, чтобы Диспетчер распределенных транзакций был включен. Некоторые подробности находятся в этом блоге MSDN .

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

Вам необходимо включить DTC для доступа к сети в конфигурации безопасности для MSDTC с помощью инструмента администрирования служб компонентов.

Если вы используете SQL Server 2000, System.Transactions.TransactionScope приведет к продвижению всех транзакций к распределенным транзакциям, требующим запуска диспетчера распределенных транзакций MS.

Вы можете исправить это, запустив службу MSDTC, обновив до SQL Server 2005 или реализуя что-то вроде моего решения для кода: http://www.codeproject.com/KB/database/typed_dataset_transaction.aspx

Мне никогда не приходилось это делать, но вы также должны проверить ответ Ocdecio на настройку параметров сетевой безопасности для DTC.

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

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

У меня была такая же проблема с интеграционными тестами.

Я задал вопрос об этом здесь

но в конце концов я нашел способ обойти это. Хотя, я бы не рекомендовал делать это для производственного кода. Я делал это в контексте тестирования.

Interesting Posts

Найти и заменить текст во всей таблице с помощью запроса MySQL

JMenuItem ImageIcon слишком большой

Как получить доступ к родительской области из пользовательской директивы * с помощью собственной области * в AngularJS?

Как остановить открытие каждого файла пакета как процесс с именем cmd.exe, как показано в диспетчере задач

Как я могу оправиться от хард-гена push -f origin master?

Предоставлять несколько накопителей большого пальца через RAID 0 / USB-концентратор лучше, чем один большой накопитель?

Извлечение фоновых изображений из файла PDF?

JSF skip Required-Validation без немедленного = true

dlopen из памяти?

Существуют ли два способа установки в openSUSE KDE и openSUSE Gnome

Может ли Winsxs быть перемещен, и если да, то как?

Почему порядок запросов в СМИ имеет значение в CSS?

Как конвертировать книги Kindle в формат PDF?

Запуск моего кода на C ++ дает мне пустую консоль

IE 11 Missing F12 Developer Tools

Давайте будем гением компьютера.