Показать сообщение отдельно
Старый 29.09.2008, 12:15   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,712 / 1201 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Для начала, строим тестовый Job для проверки собственных идей. У меня Ax2.5, поэтому логика может несколько отличаться в старших версиях.

X++:
static void test_TryCatchTransaction(Args _args)
{
    ;

    try
    {
        ttsbegin;
                ttsbegin;
                        throw exception::Deadlock;
                ttscommit;
        ttscommit;
    }
    catch (exception::Break)
    {
        info('exception::Break');
    }
    catch (exception::DDEerror)
    {
        info('exception::DDEerror');
    }
    catch (exception::Deadlock)
    {
        info('exception::Deadlock');
    }
    catch (exception::Error)
    {
        info('exception::Error');
    }
    catch (exception::Info)
    {
        info('exception::Info');
    }
    catch (exception::Internal)
    {
        info('exception::Internal');
    }
    catch (exception::Sequence)
    {
        info('exception::Sequence');
    }
    catch (exception::Warning)
    {
        info('exception::Warning');
    }

    info(strFmt("Количество вложенных транзакций = %1", appl.ttsLevel()));
}
Как и положено, исключение "выбрасывает" код на самый верхний уровень транзакции, автоматически откатывая все вложенные транзакции. Точнее, на обработчик Try..Catch внутри которого и расположена инициализация самого верхнего уровня транзакции. Все вложенные Try..Catch при этом игнорируются.

Однако возникают следующие вопросы:

Находятся ли команды по началу и завершению транзакции в одном методе? Внутри одного Try..Catch? По крайней мере, вызов методов по началу и завершению транзакции?

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

Т.е. надо отследить вот такие программные конструкции

X++:
static void test_TryCatchTransaction(Args _args)
{
    ;

    try
    {
        ttsbegin;
                throw exception::Error;
    }
    catch (exception::Error)
    {
        info('exception::Error');
    }

    // Вот здесь возникнет ошибка
    ttscommit;

}