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


Я использую 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

Я работал таким образом в другом приложении с той же средой без проблем, но здесь у меня есть эта проблема. Что я могу сделать, чтобы исправить проблему?

7 67

7 ответов:

убедитесь, что Служба " координатор распределенных транзакций работает на базе и клиенте. Также убедитесь, что вы проверяете "доступ к сети DTC", " разрешить удаленный клиент", "Разрешить входящий / исходящий"и" включить подсказку".

чтобы включить доступ к сети DTC для транзакций MS DTC

  1. откройте оснастку "службы компонентов".

    чтобы открыть службы компонентов, нажмите кнопку Пуск. В поле поиска введите MMC, а затем нажмите ВХОДИТЬ.

  2. разверните дерево консоли, чтобы найти DTC (например, локальный DTC), для которого требуется включить сетевой доступ MS DTC.

  3. меню Действие выберите пункт Свойства.

  4. нажмите на вкладку "Безопасность" и внесите следующие изменения: В разделе Параметры безопасности установите флажок доступ к сети DTC.

    в разделе связь диспетчера транзакций выберите Разрешить входящий и разрешить исходящий чек ящики.

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

эта страница:http://sysadminwebsite.wordpress.com/2012/05/29/9/ помог мне найти проблему.

в основном у меня были дубликаты CID для MSDTC на обоих серверах. 【\CID

см.:http://msdn.microsoft.com/en-us/library/aa561924.aspx раздел убедитесь, что MSDTC присвоено уникальное значение CID

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

комментарий от другого ответ: "убедитесь, что вы используете одно и то же открытое соединение для всех вызовов базы данных внутри транзакции. - Магнус "(не знаю, как связать комментарии)

наши пользователи хранятся в отдельной БД от данных, с которыми я работал в транзакциях. Открытие подключения к БД, чтобы получить пользователя было причиной этой ошибки для меня. Перемещение другого подключения к БД и поиска пользователя за пределы области транзакции исправило ошибку.

в моем сценарии исключение было вызвано тем, что я пытался создать новый экземпляр соединения в 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.
    }
}

У меня была процедура хранения, которая вызывает другую процедуру хранения в "связанном сервере".когда я выполняю его в ssms, это было нормально,но когда я вызываю его в приложении(по Entity Framework), я получил эту ошибку. Эта статья помогла мне и я использовал этот скрипт:

EXEC sp_serveroption @server = 'LinkedServer IP or Name',@optname = 'remote proc transaction promotion', @optvalue = 'false' ;

для более подробной информации посмотрите на это: связанный сервер : Партнерский диспетчер транзакций отключил поддержку удаленных и сетевых транзакций

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

не удалось выполнить операцию, так как поставщик OLE DB _ for linked server _ не смог начать распределенную транзакцию

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

перескакивая через 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 обязательно является предпочтительным выбором, но я чувствовал, что это, по крайней мере, стоит поделиться, если кто-то еще, имеющий подобные проблемы, попадает сюда google.

приведенный выше код является C#, но концепция пытается переключиться на Sql Client по-прежнему применяется. По крайней мере, это будет диагностическая попытка сделать это.

в случае, если другие имеют те же проблемы:

У меня была аналогичная ошибка происходит. оказалось, что я упаковывал несколько операторов SQL в транзакции, где один из них выполнялся на связанном сервере (оператор Merge в EXEC(...) В операторе сервера). Я решил проблему, открыв отдельное соединение со связанным сервером, инкапсулировав этот оператор в попытке...затем catch прерывает транзакцию на исходном соединении в случае отключения catch.