Менеджер транзакций отключил поддержку удаленных/сетевых транзакций
Я использую SQL Server и ASP.NET. У меня есть следующая функция:
Using js = daoFactory.CreateJoinScope()
Using tran = New Transactions.TransactionScope()
'...
tran.Complete()
End Using
End Using
Однако исключение " Менеджер транзакций отключил поддержку удаленных/сетевых транзакций. '.
Описание JoinScope:
Public Class JoinScope
Implements IJoinScope
Implements IDisposable
'...
End Class
Я работал таким образом в другом приложении с той же средой без проблем, но здесь у меня есть эта проблема. Что я могу сделать, чтобы исправить проблему?
Ответы
Ответ 1
Убедитесь, что служба "Координатор распределенных транзакций"
работая как с базой данных, так и с клиентом.
Также убедитесь, что вы проверили "Доступ к сети DTC", "Разрешить удаленный клиент",
"Разрешить входящие/исходящие" и "Включить TIP".
Чтобы включить доступ к сети DTC для транзакций MS DTC
-
Откройте оснастку "Службы компонентов".
Чтобы открыть Службы компонентов, нажмите "Пуск". В поле поиска введите dcomcnfg и нажмите клавишу ВВОД.
-
Разверните дерево консоли, чтобы найти код DTC (например, локальный DTC), для которого вы хотите включить доступ к сети DTC в сети.
-
В меню Действие выберите "Свойства".
-
Перейдите на вкладку "Безопасность" и внесите следующие изменения:
В разделе "Параметры безопасности" установите флажок "Доступ к сети DTC".
В Communication Manager Communication установите флажки Разрешить входящие и Разрешенные исходящие.
Ответ 2
Я периодически сталкивался с этой проблемой, я следил за инструкциями здесь и очень похожими в другом месте. Все настроено правильно.
Эта страница: http://sysadminwebsite.wordpress.com/2012/05/29/9/ помогла мне найти проблему.
В основном у меня был дубликат CID для MSDTC на обоих серверах. HKEY_CLASSES_ROOT\CID
Смотрите: http://msdn.microsoft.com/en-us/library/aa561924.aspx раздел Убедитесь, что MSDTC присваивается уникальное значение CID
Я работаю с виртуальными серверами, и наша команда серверов любит использовать один и тот же образ для каждого сервера. Это простое исправление, и нам не нужен перезапуск. Но для службы DTC необходимо было установить автоматический запуск и потребовалось запустить после переустановки.
Ответ 3
У меня была процедура хранения, которая вызывает другую процедуру хранения в "связанном сервере". Когда я выполняю ее в ssms, все было в порядке, но когда я вызываю ее в приложении (посредством Entity Framework), я получаю эту ошибку. Эта статья помогла мне, и я использовал этот скрипт:
EXEC sp_serveroption @server = 'LinkedServer IP or Name',@optname = 'remote proc transaction promotion', @optvalue = 'false' ;
подробнее об этом: Связанный сервер: Менеджер транзакций партнера отключил поддержку удаленных/сетевых транзакций.
Ответ 4
В моем сценарии исключение было выбрано потому, что я пытался создать новый экземпляр подключения в TransactionScope по уже существующему соединению:
Пример:
void someFunction()
{
using (var db = new DBContext(GetConnectionString()))
{
using (var transaction = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted }))
{
someOtherFunction(); // This function opens a new connection within this transaction, causing the exception.
}
}
}
void someOtherFunction()
{
using (var db = new DBContext(GetConnectionString()))
{
db.Whatever // <- Exception.
}
}
Ответ 5
Комментарий из ответа: "Убедитесь, что вы используете одно и то же открытое соединение для всех вызовов базы данных внутри транзакции. - Магнус"
Наши пользователи хранятся в отдельной базе данных от данных, с которыми я работал в транзакциях. Открытие соединения с БД для получения пользователя было причиной этой ошибки для меня. Перемещение другого соединения с БД и поиск пользователя вне области транзакции исправили ошибку.
Ответ 6
Я публикую нижеприведенное решение здесь, потому что после некоторых поисков именно там я и приземлился, так что другие тоже Я пытался использовать EF 6 для вызова хранимой процедуры, но у меня была похожая ошибка, потому что хранимая процедура имела связанный сервер.
Невозможно выполнить операцию, так как поставщик OLE DB _ для связанного сервера _ не смог начать распределенную транзакцию
Менеджер транзакций партнера отключил поддержку удаленных/сетевых транзакций *
Перепрыгнув на SQL Client, я решил проблему, которая также подтвердила, что это EF.
EF модель сгенерированная попытка метода:
db.SomeStoredProcedure();
Попытка на основе ExecuteSqlCommand:
db.Database.ExecuteSqlCommand("exec [SomeDB].[dbo].[SomeStoredProcedure]");
С:
var connectionString = db.Database.Connection.ConnectionString;
var connection = new System.Data.SqlClient.SqlConnection(connectionString);
var cmd = connection.CreateCommand();
cmd.CommandText = "exec [SomeDB].[dbo].[SomeStoredProcedure]";
connection.Open();
var result = cmd.ExecuteNonQuery();
Этот код можно сократить, но я думаю, что эта версия немного удобнее для отладки и пошагового выполнения.
Я не верю, что Sql Client обязательно является предпочтительным выбором, но я чувствовал, что по крайней мере стоит поделиться им, если кто-то с подобными проблемами попадет сюда через Google.
Код выше - С#, но концепция попытки переключения на Sql Client по-прежнему применима. По крайней мере, попытка сделать это будет диагностической.
Ответ 7
В случае, если другие имеют такую же проблему:
У меня была аналогичная ошибка. оказалось, что я обертывал несколько операторов SQL в транзакции, где один из них выполнялся на связанном сервере (оператор Merge в выражении EXEC (...) AT Server). Я решил проблему, открыв отдельное соединение с связанным сервером, инкапсулируя этот оператор в try... catch, а затем прерву транзацию в исходном соединении, если сбой отключен.
Ответ 8
У меня было то же сообщение об ошибке. Для меня изменение pooling=False
на ;pooling=true;Max Pool Size=200
в строке подключения решило проблему.
Ответ 9
У меня была проблема со связанным сервером в SSMS при попытке создать хранимую процедуру.
На связанном сервере я изменил параметр сервера "Включить продвижение в распределенной транзакции" на "Ложь".
Снимок экрана параметров сервера