20.09.2005, 09:19 | #1 |
Участник
|
Механизм отката операций
На днях возникла следующая мысля на тему отката операций. Охота получить порцию критики о целесообразности таковой.
Идея следующая: Принцип действия механизма основан на возможности журнализации базы данных средствами Axapta. В связи с этим для использования механизма необходимо, чтобы была активирована лицензия «Database Log», и включен конфигурационный ключ «Журнал базы данных». Помимо возможности журнализации базы данных здесь также используется механизм трассировки SQL-запросов. Перед началом операции, для которой впоследствии может потребоваться возможность отката, включается трассировка SQL-запросов и журнализация тех таблиц, в которые вносятся изменения в процессе выполнения операции. Список таблиц для каждой операции берется из таблицы 1 (изначально она пуста). По окончании операции отключаются механизм трассировки SQL-запросов и журнализация базы данных. Необходимым условием является, чтобы операция не содержала вывод каких-либо диалоговых окон (исключая infolog об окончании операции и Progress Operation). Далее анализируется набор выполненных SQL-запросов. Если в процессе операции были выявлены изменяемые таблицы, которые не присутствуют в таблице 1, то они вносятся в эту таблицу. В этом случае откат по этому конкретному экземпляру операции будет невозможен. Однако в таблицу 1 будут внесены все необходимые таблицы, чтобы обеспечить откат при последующих выполнениях этой операции. Если в процессе анализа SQL-запросов новых таблиц не выявлено, то из таблицы SysDatabaseLog в таблицу 2 копируются записи SQL-операций, влияющих на изменения в таблицах базы данных. В эту же таблицу копируются модифицированные записи всех таблиц (***). Далее при необходимости отката выполненной операции из таблицы 2 в обратном порядке изымаются записи, и выполняются действия обратные тем, что указаны в таблице 2. (т.е. если была операция insert, то выполняется delete [это не всегда - исключения ниже]). Перед выполнением отката записи всех таблиц, участвующих в операции, проверяются на эквивалентность тем, что сохранены на шаге *** (см. выше) , указанных в таблице 2 на момент совершения операции. Если соответствия нарушены, то откат будет невозможен. Этим достигается невозможность отката, если после операции была выполнена другая операция, которая повлекла за собой изменения в тех же записях, что и первая операция. Исключением здесь являются таблицы LedgerBalancesTrans и LedgerBalancesDimTrans. Надеюсь объяснил понятно. Ваше мнение. |
|