Как реализовать единую транзакцию в Entity Framework 5 с контекстной базой данных SQL и DB2

Я пытаюсь реализовать оба DbContext (SQLDBContext & DB2Context) в одной транзакции, но каждый раз сталкиваюсь с проблемой, связанной с DB2.

Он отлично работает с SQL, но выдает ошибку при попытке доступа к DB2.

Исключение составляют:

Ошибка в получателе DB2Entities. Ошибка связи с базовым менеджером транзакций.

Диспетчеру транзакций MSDTC не удалось получить транзакцию из исходного диспетчера транзакций из-за проблем со связью. Возможные причины: присутствует брандмауэр, и он не имеет исключения для процесса MSDTC, две машины не могут найти друг друга по своим NetBIOS-именам или поддержка сетевых транзакций не включена для одного из двух менеджеров транзакций. (Исключение из HRESULT: 0x8004D02B)

Пожалуйста, помогите мне реализовать обе транзакции БД в рамках одной транзакции ИЛИ, если одна из них не удалась, обе должны откатиться.

Код похож:

var option = new TransactionOptions
{
    IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted,
    Timeout = TimeSpan.FromSeconds(60)
};

using (var scopeOuter = new TransactionScope(TransactionScopeOption.Required, option))
{
    SQLDBContext.Table.AddSomething();
    SQLDBContext.SaveChanges();

    using (var scopeInner = new TransactionScope(TransactionScopeOption.Required, option))
        {
                DB2Context.Table.AddSomething();
                DB2Context.SaveChanges();
                scopeInner.Complete();
        }
       scopeOuter.Complete();
}

Спасибо!


person Swapnil Yelattiwar    schedule 27.11.2018    source источник
comment
Пробовали ли вы проверить, что MSDTC установлен, включен и не заблокирован брандмауэрами на любой из задействованных машин (на двух серверах баз данных и на вашей машине разработки)? Также обратите внимание, что транзакция не повышается до распределенной транзакции до тех пор, пока это не потребуется, поэтому выполнение серии обновлений только на сервере SQL будет работать нормально, даже если MSDTC был настроен неправильно.   -  person Andy Hames    schedule 27.11.2018
comment
Я бы сказал, установлен и включен на всех машинах и не заблокирован брандмауэром ни на одной из них.   -  person Andy Hames    schedule 27.11.2018
comment
Измените свой вопрос, чтобы полностью описать версии каждого компонента, например какой поставщик сервера данных для .net вы используете для Db2, какую версию .NET Framework, какую версию VSAI, какую разрядность клиента Db2 и сведения о версии.   -  person mao    schedule 27.11.2018


Ответы (1)


В DB2 вам нужно будет включить транзакции XA для MSDTC. Поскольку вы также используете несколько баз данных, вам может также необходимо включить доступ к сети DTC (см. Изображение ниже).

Чтобы изменить эти параметры, откройте оснастку управления службами компонентов («Администрирование» -> «Службы компонентов» или запустите comexp.msc). Затем в разделе «Компьютеры» -> «Мой компьютер» -> «Координатор распределенных транзакций» щелкните правой кнопкой мыши «Локальный DTC» и выберите «Свойства». Вы получите экран, показанный ниже.

Конфигурация MSDTC

person bhamby    schedule 30.11.2018