Ошибка «Операция недопустима для состояния транзакции» и область действия транзакции - PullRequest
52 голосов
/ 11 октября 2008

При попытке вызвать хранимую процедуру, содержащую инструкцию 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
        //
    }
}

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

Ответы [ 5 ]

48 голосов
/ 15 октября 2008

После некоторых исследований кажется, что я не могу открыть два соединения с одной и той же базой данных с блоком 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
    }
}
9 голосов
/ 30 ноября 2010

Я также столкнулся с той же проблемой, я изменил время ожидания транзакции до 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();
    ...

}
7 голосов
/ 06 февраля 2012

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

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

<system.transactions> 
        <machineSettings maxTimeout="00:05:00" /> 
</system.transactions>
2 голосов
/ 11 октября 2008

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

1 голос
/ 04 мая 2018

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

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

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

...