Ошибка TransactionScope в Sql Server 2000 - менеджер транзакций партнера отключил поддержку удаленных / сетевых транзакций - PullRequest
5 голосов
/ 26 ноября 2008

Я пытаюсь настроить простую транзакцию для моих действий Linq-to-Sql в моей базе данных Sql 2000. С использованием TransactionScope это выглядит так:

using (TransactionScope transaction = new TransactionScope())
{
    try
        {
        Store.DBDataContext dc = new Store.DBDataContext();
        Store.Product product = GetProduct("foo");
        dc.InsertOnSubmit(product);
        dc.SubmitChanges();
        transaction.Complete();
    }
    catch (Exception ex)
    {                
        throw ex;
    }
}

Однако я продолжаю получать следующую ошибку:

Менеджер транзакций партнера отключил поддержку удаленных / сетевых транзакций. (Исключение из HRESULT: 0x8004D025)

Но, если я настроил транзакцию, используя традиционную транзакцию, она работает нормально. Так что это прекрасно работает:

Store.DBDataContext dc = new Store.DBDataContext();
try
{
    dc.Connection.Open();
    dc.Transaction = dc.Connection.BeginTransaction();
    Store.Product product = GetProduct("foo");
    dc.InsertOnSubmit(product);
    dc.SubmitChanges(); 
    dc.Transaction.Commit();
}
catch (Exception ex)
{
    dc.Transaction.Rollback();
    throw ex;
}
finally
{
    dc.Connection.Close();      
    dc.Transaction = null;
}

Мне интересно, выполняет ли TransactionScope что-то другое под покровом, чем моя вторая реализация. Если нет, что я теряю, не используя TransactionScope? Кроме того, любое руководство о том, что является причиной ошибки, также было бы хорошо. Я подтвердил, что MSDTC работает как на сервере sql, так и на моем клиентском компьютере.

Ответы [ 5 ]

6 голосов
/ 26 ноября 2008

Взгляните сюда:

Быстрые транзакции с System.Transactions и Microsoft SQL Server 2000 http://blogs.msdn.com/florinlazar/archive/2005/09/29/475546.aspx

А здесь:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=230390&SiteID=1

Сначала убедитесь, что служба «Координатор распределенных транзакций» работает как на компьютере сервера базы данных, так и на клиентских компьютерах
1. Перейдите в «Администрирование> Сервисы»
2. Включите службу «Distribute Transaction Coordinator», если она не запущена

Если он работает, а клиентское приложение не на том же компьютере, что и сервер базы данных, на компьютере под управлением сервера базы данных
1. Перейдите в «Администрирование> Службы компонентов»
2. В левом дереве навигации перейдите к «Службы компонентов> Компьютеры> Мой компьютер» (может потребоваться двойной щелчок и ожидание, так как некоторые узлы нужно время для расширения)
3. Щелкните правой кнопкой мыши «Мой компьютер», выберите «Свойства»
4. Выберите вкладку «MSDTC»
5. Нажмите «Настройка безопасности»
6. Убедитесь, что вы отметили «Доступ по сети DTC», «Разрешить удаленный клиент», «Разрешить входящий / исходящий», «Включить СОВЕТ» (некоторые параметры могут быть недоступны необходимо, попробуйте получить вашу конфигурацию)
7. Сервис перезапустится
8. НО ВАМ МОЖЕТ НУЖНО ПЕРЕЗАГРУЗИТЬ СЕРВЕР, ЕСЛИ ЭТО ЕЩЕ НЕ РАБОТАЕТ (Это то, что раньше сводило меня с ума)

На вашем клиентском компьютере используйте ту же процедуру, чтобы открыть Настройка «Конфигурация безопасности», убедитесь, что вы отметили «Сетевой DTC Доступ »,« Разрешить входящий / исходящий », перезапустить службу и компьютер при необходимости.

На вашем диспетчере служб SQL-сервера нажмите раскрывающийся список «Служба», выберите «Распределить координатор транзакций», он также должен работать на ваш серверный компьютер.

2 голосов
/ 26 ноября 2008

Реализация DatabaseTransactionAdapter в публикации Florin Lazar, на которую мне указал Кит Сирмонс, похоже, делает свое дело. Вот мой код, который вызывает его:

Store.DBDataContext dc = new Store.DBDataContext();
using (TransactionScope transaction = new TransactionScope())
{
    try
    {
        var dbAdapter = new DatabaseTransactionAdapter(dc.Connection);
        dc.Connection.Open();
        dbAdapter.Begin();
        dc.Transaction = (SqlTransaction)dbAdapter.Transaction;
        Store.Product product = GetProduct("foo");
        dc.InsertOnSubmit(product);
        dc.SubmitChanges();
        transaction.Complete();
    }
    catch (Exception ex)
    {                
        throw ex;
    }
}

Единственное, что меня беспокоит, это то, что я не закрываю соединение явно, даже если оно не объявлено в операторе using.

Но, по словам Флорина Лазаря, это специально.

И вы также не должны закрывать соединение, потому что соединение должен оставаться открытым до транзакции завершено, что происходит после «Использование» оператора заканчивается. Адаптер возьмет на себя ответственность за соединение время жизни и закройте его, когда это будет сделано с этим.

1 голос
/ 26 июля 2013

Шаги для включения этого в Windows 2008 или более поздней версии:

Сначала убедитесь, что служба «Координатор распределенных транзакций» работает как на компьютере сервера базы данных, так и на клиентских компьютерах

  1. Перейдите в «Администрирование> Сервисы»
  2. Включите службу «Distribute Transaction Coordinator», если она не запущена

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

  1. Перейдите в «Администрирование> Службы компонентов»
  2. В левом дереве навигации выберите «Службы компонентов> Компьютеры> Мой компьютер> Координатор распределенных транзакций» (может потребоваться двойной щелчок и ожидание, поскольку некоторым узлам требуется время для расширения)
  3. Щелкните правой кнопкой мыши по «Местному DTC», выберите «Свойства»
  4. Выберите вкладку «Безопасность»
  5. Убедитесь, что вы отметили «Доступ по DTC по сети», «Разрешить удаленный клиент», «Разрешить входящий / исходящий»
  6. Служба перезапустится
  7. НО ВАМ МОЖЕТ НУЖНО ПЕРЕЗАГРУЗИТЬ СЕРВЕР, ЕСЛИ ЭТО ЕЩЕ НЕ РАБОТАЕТ (Это то, что раньше сводило меня с ума)

На вашем клиентском компьютере использовать та же процедура, описанная выше, чтобы открыть настройку «Конфигурация безопасности», убедитесь, что вы отметили «Доступ по сети DTC», «Разрешить входящий / исходящий» вариант, перезапустите сервис и компьютер при необходимости.

На вашем сервере SQL Диспетчер сервисов, нажмите «Сервис», выберите «Распространить» Координатор транзакций ", он также должен быть запущен на вашем сервере компьютер.

0 голосов
/ 10 мая 2018

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

Операция не может быть выполнена, поскольку поставщик OLE DB _ для связанного сервера _ не смог начать распределенную транзакцию

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

Переход на Клиент SQL исправил мою проблему, которая также подтвердила для меня, что это 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.

0 голосов
/ 26 марта 2009

больше обратите внимание, что: - Руководство по настройке сервера Включить сетевой доступ COM + (Windows Server 2003) Пуск ==> Панель управления ==> Установка и удаление программ ==> Установка и удаление компонентов Windows, выберите Сервер приложений и нажмите кнопку Подробнее. Нажмите Включить доступ к сети COM +, а затем нажмите ОК. Нажмите Далее, а затем нажмите Готово.
- Если между двумя серверами установлен межсетевой экран, откройте межсетевой экран для обоих входов / выходов на этом порте диапазона: Нажмите Пуск ==> Панели управления ==> Администрирование ==> Службы компонентов. Разверните Сервис компонентов, разверните Компьютеры, щелкните правой кнопкой мыши на Мой компьютер и выберите Свойства. В окне «Свойства моего компьютера» перейдите на вкладку «Протокол по умолчанию», щелкните TCP / IP с установлением соединения и выберите «Свойства». в новом окне нажмите кнопку Добавить и введите новый диапазон портов DTC. Нажмите OK, чтобы применить эти изменения. Сервер должен быть перезапущен, чтобы новые изменения вступили в силу

...