Сообщение об ошибке Firebird "Неудачное выполнение, вызванное системной ошибкой, которая препятствует успешному выполнению последующих операторов"
Мое приложение генерирует иногда такие ошибки при доступе к базе данных Firebird:
Неудачное выполнение, вызванное системной ошибкой, которая препятствует успешному выполнению последующих операторов. Код GDS: 335544726 - Код SQL: -902 - Код ошибки: 406'
В чем может быть проблема? Есть ли способ отладить это?
Я использую Firebird 2.5.1 в Windows 7. По крайней мере, есть kinterbasdb с компонентами Python и UIB с Delphi.
1 ответ
Похоже, что причиной этого было использование одного и того же соединения / транзакции из нескольких потоков.
После того, как мы перешли на UIB (с IBX), у нас тоже было много подобных ошибок.
Это вызвано типом транзакции (Option) TUIBTransaction. Оба:
"Прочитано":[tpNowait,tpReadCommitted,tpRecVersion]
и
"Снимок":[tpConcurrency,tpNowait]
вызвал то же самое, из-за "tpNowait". Особенно после перехода с обычных HDD на SSD. (Вставкаsleep(2);
между каждой строкой, строкой TR.Start; sleep(2); ... TR.Commit;
немного помогло, но не решило полностью.)
Мы не хотели использовать просто tpWait, потому что это было слишком рискованно, приложение могло зависнуть навсегда.
Итак, решение заключалось в следующем:
1. Изменить параметр транзакции на "по умолчанию".[tpConcurrency,tpWait,tpWrite]
2.) Устанавливаем во время выполнения TR.LockTimeOut := 5; //seconds
каждый раз перед началом транзакции. (Если произошел сбой из-за тайм-аута, вы можете повторить выполнение с более высоким значением, при этом целесообразно сообщить пользователю о зависшем пользовательском интерфейсе.)
ВАЖНО:
текущий (2016) код UIB не может обрабатыватьLockTimeOut
вообще. Сначала это нужно исправить. Смотрите код здесь...