Зафиксировать транзакцию, если ее часть не удалась
У меня есть метод, работающий в COM+, который выглядит примерно так:
[AutoComplete(true)]
public bool DoSomething(string args)
{
DoSomeDBWork(args);
try {
DBAccess.RunQuery("INSERT fail");
return 0;
}
catch (Exception ex)
{
//Hide the error because it doesnt matter - log it out though for completeness
DBAccess.RunQuery("INSERT INTO Log VALUES ('{0}')", ex.ToString());
return -1
}
}
Итак, метод работает, метод DoSomeDBWork() запускает некоторые обновления в БД.
Запускается ошибка вставки, которая завершается ошибкой. Я просто хочу проигнорировать это, но выйти, что это не удалось.
Но я получаю сообщение об ошибке: System.Transactions.TransactionException: операция недопустима для состояния транзакции.
Я предполагаю, что, хотя я ловлю исключение, потому что это ошибка БД, он автоматически откатывает транзакцию.
Ошибка происходит из строки "вставить в журнал..."
и все, что было обновлено в DoSomeDBWork(), также откатывается.
Как я могу игнорировать неудачную линию?
1 ответ
Вам придется откатить транзакцию, используемую для "Вставить сбой...", прежде чем пытаться вставить в журнал. Не знаком с DBAccess и его работой, но после отката вы сможете начать новую транзакцию неявно или явно.
[AutoComplete(true)]
public bool DoSomething(string args)
{
DoSomeDBWork(args);
try {
DBAccess.RunQuery("INSERT fail");
return 0;
}
catch (Exception ex)
{
DBAccess.Rollback();
DBAccess.RunQuery("INSERT INTO Log VALUES ('{0}')", ex.ToString());
return -1
}
}