Добрый день.
Я столкнулся с очень интересной проблемой. Проблема если честно беспокоит не первый день, но отловить её удалось совсем вот только полчаса назад и надеюсь что вы подскажете возможное направление решения.
И так. Есть некоторая таблица, в которой хранится 7500000 записей.
Записи каждый раз обновляются по следующему принципу:
1. Отдельный запрос(TADCommand) который удаляет из таблицы все данные(Commit выполняется сразу после команды Execute)
2. Датасет который прочитал из БД ранее 50 записей я переоткрываю, т.е. просто выполняю Close, Open.(датасет перевожу в режим CachedUpdates=true после открытия)
3. Далее выполняю добавление записей через Append.
4. Выполяняю ApplyUpdates, CommitUpdates и подтверждение транзакции.
Как правило первый раз всё происходит успешно, но любой другой может увенчаться ошибкой дублирования ключа(так получилось что каждый раз ключ записей остаётся одинаковым).
Данная ошибка, как я понимаю, возникает в следствие того что запрос на удаление уходит на сервер и там выполняется сервером(и видимо при таком количестве записей не слишком быстро), при этом никак не контролируясь со стороны компонентов. И когда я выполняю CloseOpen у меня могут быть удалены ещё не все записи :-O .
Я понимаю что решением проблемы вполне может быть удаление каждой записи из датасета, т.е. TADQuery.Delete, пока количество записей не станет 0, но так гораздо дольше, особенно, если записей например не 50, а 5000. Или скажем переоткрывать датасет пока количество записей не будет 0, но тоже не выход, можно отправлять запрос на Count чтобы убедится, что все записи удалены, но мне кажется это тоже костыль(хотя с условием отбора он выполняется очень быстро).
Вот, такая вот интересная у меня проблема, может вы сможете что-то посоветовать?
P.S. БД Firebird 2.5
↧