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

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

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

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

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

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

" ошибка HRESULT E_FAIL была возвращена из вызова компонента COM."
"Связь с базовым менеджером транзакций не удалась."

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

вот свойства на клиенте:
клиент http://www.portnine.com/data/images/Misc/client.jpg

вот свойства на сервере:
сервер http://www.portnine.com/data/images/Misc/server.jpg

7 ответов


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

вот снимок экрана того, что мы используем, за исключением опции "разрешить удаленное администрирование" : Security Configuration Screenshot

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

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

наконец, хотя и не специфично для вашей проблемы, очень важно отметить об использовании 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 (проверено) / разрешить удаленным клиентам (проверено) / разрешить входящие (проверено) / разрешить исходящие (проверено) / включить транзакции подсказки (проверено)

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


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

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


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


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

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

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


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

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


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

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

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