Зафиксировать транзакцию, если ее часть не удалась

У меня есть метод, работающий в 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
    }
}
Другие вопросы по тегам