Подтвердить что ты не робот

"Операция недействительна для состояния транзакции". Ошибка и область транзакции.

Я получаю следующую ошибку, когда пытаюсь вызвать хранимую процедуру, содержащую инструкцию SELECT:

Операция недействительна для состояния транзакции

Вот структура моих вызовов:

public void MyAddUpdateMethod()
{

    using (TransactionScope Scope = new TransactionScope(TransactionScopeOption.RequiresNew))
    {
        using(SQLServer Sql = new SQLServer(this.m_connstring))
        {
            //do my first add update statement

            //do my call to the select statement sp
            bool DoesRecordExist = this.SelectStatementCall(id)
        }
    }
}

public bool SelectStatementCall(System.Guid id)
{
    using(SQLServer Sql = new SQLServer(this.m_connstring)) //breaks on this line
    {
        //create parameters
        //
    }
}

Является ли проблема с созданием другого соединения с одной и той же базой данных в транзакции?

4b9b3361

Ответ 1

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

public void MyAddUpdateMethod()
{
    using (TransactionScope Scope = new TransactionScope(TransactionScopeOption.RequiresNew))
    {
        using(SQLServer Sql = new SQLServer(this.m_connstring))
        {
            //do my first add update statement            
        }

        //removed the method call from the first sql server using statement
        bool DoesRecordExist = this.SelectStatementCall(id)
    }
}

public bool SelectStatementCall(System.Guid id)
{
    using(SQLServer Sql = new SQLServer(this.m_connstring))
    {
        //create parameters
    }
}

Ответ 2

Я также сталкивался с той же проблемой, я изменил время ожидания транзакции до 15 минут, и он работает. Надеюсь, это поможет.

TransactionOptions options = new TransactionOptions();
options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
options.Timeout = new TimeSpan(0, 15, 0);
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required,options))
{
    sp1();
    sp2();
    ...

}

Ответ 3

Когда я столкнулся с этим исключением, появилось InnerException "Тайм-аут транзакции". Поскольку это было во время сеанса отладки, когда я некоторое время останавливал свой код внутри TransactionScope, я решил проигнорировать эту проблему.

Когда это конкретное исключение с таймаутом появляется в развернутом коде, я думаю, что следующий раздел в вашем файле .config поможет вам:

<system.transactions> 
        <machineSettings maxTimeout="00:05:00" /> 
</system.transactions>

Ответ 4

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

Ответ 5

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

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

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