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

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

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

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

Edit

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

{"Error HRESULT E_FAIL has been returned from a call to a COM component."}
{"Communication with the underlying transaction manager has failed."}

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

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

Вот свойства на сервере:

Сервер http://www.portnine.com/data/images/Misc/server.jpg

Ответ 1

Вам необходимо включить доступ к 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. 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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

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

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