Менеджер транзакций отключил поддержку удаленных/сетевых транзакций

Я использую 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 при попытке создать хранимую процедуру.

На связанном сервере я изменил параметр сервера "Включить продвижение в распределенной транзакции" на "Ложь".

Снимок экрана параметров сервера