Как использовать TransactionScope в C #? - PullRequest
35 голосов
/ 27 апреля 2009

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

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

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

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

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

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

Решение Я думаю, что принятый ответ исправил начальную проблему, которую я получил. Вторая ошибка, кажется, характерна для Entity Framework. Я отправлю другой вопрос для этого.

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

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

Ответы [ 7 ]

33 голосов
/ 27 апреля 2009

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

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

Я не сталкивался с проблемой 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) ценности. Увидеть http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2netwk.mspx#XSLTsection128121120120 для получения дополнительной информации о RestrictRemoteClients.

Наконец, хотя это и не относится к вашей проблеме, очень важно отметить, что при использовании класса TransactionScope его настройкой по умолчанию является использование уровня изоляции транзакции 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
}
2 голосов
/ 27 апреля 2009

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

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

2 голосов
/ 27 апреля 2009

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

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

1 голос
/ 27 апреля 2009

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

0 голосов
/ 27 апреля 2009

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

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

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

0 голосов
/ 27 апреля 2009

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

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

0 голосов
/ 27 апреля 2009

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

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

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

...