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

Поскольку вы уже используете вход, нет смысла использовать NodePort. Поскольку у вас уже есть способ получить доступ к вашему приложению. Вполне нормально иметь тип сервиса, который вам нужен на уровне сервиса, который вам нужен для внутреннего доступа (в рамках Kubernets).

36
задан shA.t 25 August 2018 в 13:23
поделиться

7 ответов

Вам необходимо включить сетевой доступ по 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
}
33
ответ дан 27 November 2019 в 06:13
поделиться

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

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

3
ответ дан 27 November 2019 в 06:13
поделиться

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

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

2
ответ дан 27 November 2019 в 06:13
поделиться

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

1
ответ дан 27 November 2019 в 06:13
поделиться

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

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

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

0
ответ дан 27 November 2019 в 06:13
поделиться

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

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

0
ответ дан 27 November 2019 в 06:13
поделиться

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

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

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

0
ответ дан 27 November 2019 в 06:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: