"Операция недействительна для состояния транзакции". Ошибка и область транзакции.
Я получаю следующую ошибку, когда пытаюсь вызвать хранимую процедуру, содержащую инструкцию 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
//
}
}
Является ли проблема с созданием другого соединения с одной и той же базой данных в транзакции?
Ответы
Ответ 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
Для меня эта ошибка возникла, когда я пытался откат блока транзакций после столкновения с исключением, внутри другого блока транзакций.
Все, что я должен был сделать, чтобы исправить это, - это удалить мой внутренний блок транзакций.
При использовании вложенных транзакций все может стать довольно беспорядочным, лучше всего избежать этого и просто перестроить свой код.