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

Я получаю следующую ошибку при попытке вызвать хранимую процедуру, содержащую инструкцию 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 ответов


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

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

}

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

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

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

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


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

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

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