Как использовать TransactionScope в C #?
Я пытаюсь использовать TransactionScope
, но продолжаю получать исключение ниже.
Приложение работает на другой машине, чем в базе данных, если это имеет значение. Я использую SQL Server 2005.
Доступ к сети для Диспетчера распределенных транзакций (MSDTC) отключен. Включите DTC для доступа к сети в конфигурации безопасности для MSDTC с помощью инструмента администрирования служб компонентов.
using (TransactionScope tsTransScope = new TransactionScope()) { //Do stuff here tsTransScope.Complete(); }
редактировать
- Как отлаживать время ожидания ожидания ожидания ожидания на сервере MySQL?
- как преобразовать data.frame в транзакции для arules
- ACID и транзакции базы данных?
- Отношение уровней изоляции транзакций с блокировками на столе
- транзакция mysql - откат на любом исключении
Я сделал некоторые изменения, основанные на обратной связи. Теперь я получаю эту ошибку:
«Ошибка вызова 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 в список исключений брандмауэра на машине приложения.
У меня была такая же проблема с интеграционными тестами.
Я задал вопрос об этом здесь
но в конце концов я нашел способ обойти это. Хотя, я бы не рекомендовал делать это для производственного кода. Я делал это в контексте тестирования.