Senthilkumar 1982 Ответов: 2

Ошибка области вложенных транзакций .Net - диспетчер транзакций MSDTC не смог извлечь транзакцию


Приведенная ниже ошибка возникает при выполнении нескольких транзакций в одной области транзакций

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

Я использую приведенный ниже пример кода для сохранения данных карты,
public Int64 SaveDetails(CardDO _Card)
{
    try
    {
        Int64 PayerId = 0;
        // Begin the transcation and call the add method
        var transactionScopeOptions = new TransactionOptions();
        transactionScopeOptions.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
        transactionScopeOptions.Timeout = TimeSpan.MaxValue;
        using (TransactionScope OuterScope = new TransactionScope(TransactionScopeOption.Required, transactionScopeOptions))
        {
            using (TransactionScope InnerScope1 = new TransactionScope())
            {
                PayerId = SavePayer(_Card.PayerDetails, _Card.ROW_STATE);
                InnerScope1.Complete();
            }
            _Card.PAYER_ID = PayerId;
            using (TransactionScope InnerScope2 = new TransactionScope())
            {
                _Card.PAYER_ID = PayerId;
                if (_Card.ROW_STATE == RowState.Created)
                {
                    _Card._CARD_ID = SaveCardDetails(_Card);
                }
                else if (_Card.ROW_STATE == RowState.Modified)
                {
                    int result = UpdateCardDetails(_Card);
                    if (result <= 0)
                    {
                        throw new Exception("Error :  card updation failed.");
                    }
                }
                InnerScope2.Complete();
            }
            using (TransactionScope InnerScope3 = new TransactionScope())
            {
                SaveCardLabour(_Card.CardLabourList, _Card.ROW_STATE, _Card._CARD_ID);
                InnerScope3.Complete();
            }
            OuterScope.Complete();
        }
        // DALHelper.Instance.Commit(); // Commit the Transcation
        return _Card._CARD_ID;
    }
    catch (TransactionAbortedException ex)
    {
        throw new Exception(" Card Save Aborted: " + ex.Message);
    }
    catch (Exception ex)
    {
        throw ex;
    }
}


Первый вызов БД "SavePayer()" работает идеально; когда он входит во второй вызов БД "SaveCardDetails", транскрипция становится неудачной, и я получаю следующую ошибку,

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

Если у вас есть какие - то идеи по этому вопросу, помогите мне..

Sunasara Imdadhusen

Я изменил название вопроса. Не делайте название вашего вопроса слишком длинным. она должна быть короткой и понятной

2 Ответов

Рейтинг:
1

Preetam U Ramdhave

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


Рейтинг:
1

Member 14656906

выключите брандмауэр на локальном компьютере