Внимание! BUG!
Баг # OE00225722:
65536: maximum number of sub-transactions
Transaction not completely rolled back when more than 65,536 sub-transactions http://knowledgebase.progress.com/articles/Article/000036325
OpenEdge 10.2B05, 10.2B06, 10.2B07, 11.0, 11.1
The fix for this issue is expected to be in the upcoming release 10.2B08.
As of 4/5/2013, release 10.2B08 is scheduled to be released in Q4, 2013 subjected to changes.
Пример такой транзакции:
Код: do transaction:
for each table where ...:
update table.
end.
end.
Статья говорит о неполном откате таких транзакций, но ситуация на самом деле хуже. Транзакция с большим числом субтранзакций может успешно завершиться, оставив после себя поврежденные данные, которые будут восприниматься как поврежденные индексы.
Ошибки: SYSTEM ERROR: Index in for recid could not be deleted. (1422)
** already exists with . (132)
Причем ошибка 132 может выдаваться для неуникального (!!!) индекса.
На самом деле индексные ключи содержат правильные значения (соответсвующие последним изменениям, сделанным в рамках транзакции), а вот изменения в самих записях могут оказаться потерянными. Из сотен тысяч записей, измененных в рамках большой транзакции, поврежденными могут оказать единицы, а могут и десятки тысяч записей.
Баг исправлен в hotfix'е, который ставится поверх сервис-пака 10.2B07.
Лечение базы
Логично предположить, что для устранения ошибок нужно перестроить индексы в базе. Но это неправильное решение. Индексы будут построены для записей, в которых были потеряны последние изменения. Например, в одном случае баг проявил себя в большой транзакции, в рамках которой создавались новые записи. Как известно оператор CREATE создает "голенькую" запись - копию template записи, в которой все поля имеют значения по умолчанию. Из-за бага в базе появилось огромное число таких "голеньких" записей. Перестройка индексов удалит индексные ключи, содержавшие актуальные значения полей и проиндексирует никому ненужные пустышки. Физическое состояние базы будет корректным, чего, к сожалению, нельзя будет сказать о логической консистентности базы. Удалить пустышки и потом перестроить индексы? Но это потеря "части" транзакции, а транзакция, как известно, по определению не может завершиться лишь частично. Нужно разбираться, есть ли возможность повторно выполнить операцию только для этих записей или нужно откатить все изменения, сделанные в рамках проблемной транзакции. Т.е. лечение базы, поврежденной этим багом, - задача нетривиальная.
На вашем месте я бы в срочном порядке запросил Hot Fix.
|