Концепция UNDO
Операция UNDO в ABL гарантирует, что незавершенные изменения постоянных данных (полей в записях базы данных) не будут записаны в базу данных при возникновении состояния ERROR или STOP. Так как язык ABL является ориентированным на транзакции, такой набор незавершенных изменений, по сути, эквивалентен текущей активной транзакции. Операция UNDO, другими словами, откатывает текущую транзакцию.
ABL распространяет защиту изменений также на локальные переменные и временные таблицы – по умолчанию. Если такие локальные данные присутствуют в блоке, при ошибке AVM откатывает их значения, независимо от того, является ли блок транзакционным. Поддержка возможности такого отката требует дополнительных затрат – рекомендуется всегда, когда это возможно, определять переменные и временные таблицы с опцией NO-UNDO.
Замечание: Понимание транзакций является важным для понимания обработки ошибок. Смотри соответствующую главу данного учебника.
Действия после отката
После выполнения отката AVM должен определить, какое действие необходимо выполнить далее. Возможные действия описаны ниже:
RETRY – повторить блок. Если в блоке выполняется ввод данных, это позволяет предоставить пользователю другой шанс ввести правильные данные. В современных распределенных приложениях практически не используется.
LEAVE – покинуть блок. Выполняется выход из блока и выполнение продолжается со следующего за блоком оператора.
NEXT – указывает, что следует выйти из текущей итерации блока и продолжить выполнение со следующей итерации. Если не имеется «следующей» итерации, действие аналогично LEAVE.
RETURN – указывает, что необходимо выйти из блока и немедленно выйти из текущей процедуры. Выполнение продолжится в вызывающей процедуре с оператора после точки вызова. Если вызывающей процедуры нет, произойдет выход из приложения. RETURN имеет собственные опции и будет подробно рассмотрен ниже.
THROW – (структурная обработка ошибок) – указывает, что AVM должен подавить стандартное сообщение об ошибке, выйти из блока и передать объект ошибки вызывающей процедуре или охватывающему блоку.
Для каждого типа блока определены свои действия после отката, сводка приведена в таблице (Таблица 4).
Таблица 4. Действия после отката по умолчанию
Тип блока |
Выполняется ввод | Итерационный |
Прочие случаи |
DO TRANSACTION | RETRY | NEXT | LEAVE |
FOR | RETRY | NEXT | N/A |
REPEAT | RETRY | NEXT | LEAVE |
End blocks | N/A | N/A | THROW |
Routine-level blocks | RETRY | N/A | LEAVE |
Trigger procedure file | RETRY | N/A | RETURN ERROR |
Оператор UNDO
Вам может потребоваться откатить транзакцию в случае, когда бизнес-логика Вашего приложения обнаружила ошибку, не связанную с ошибками базы данных или исполнения кода ABL. Для этой цели Вы можете использовать оператор UNDO. Синтаксис оператора:
UNDO [ label1 ]
[ , LEAVE [ label2 ] | , NEXT [ label2 ] | , RETRY [ label1 ] | ,
RETURN [ return-value | ERROR [ return-value | error-object-expression ] | NO-APPLY ]
| , THROW error-object-expression ]
Обратите внимание метки в описании синтаксиса. Если Вы определяете метки блоков, они могут быть использованы для явного указания, какой именно блок следует откатить, или покинуть и т.д. Другими словами, метки позволяют Вам контролировать объем откатываемой информации в транзакциях с вложенными блоками.