У меня проблема с базой данных sqlite3, которая остается заблокированной / недоступной после определенного доступа.
Поведение до сих пор происходит в Ubuntu 10.4 и в пользовательском (OpenEmbedded) Linux.Версия sqlite - 3.7.7.1).БД - это локальный файл.
Один C ++ - приложения периодически обращаются к БД (5 с).Каждый раз несколько операторов вставки заключаются в отложенную транзакцию.Это происходит только в одном потоке.Подключение к БД проводится в течение всего срока службы приложения.Используемые операторы также являются постоянными и используются повторно через sqlite3_reset
.Для sqlite_threadsafe задано значение 1 (сериализовано), для ведения журнала задано значение WAL.
Затем я открываю в parellel базу данных sqlite с помощью инструмента командной строки sqlite.Я ввожу BEGIN IMMEDIATE;
, жду> 5 с и фиксирую с помощью END;
.
, после чего происходит сбой доступа к базе данных приложения: BEGIN TRANSACTION
возвращает код возврата 1 («Ошибка SQL или отсутствует база данных»),Если я выполню ROLLBACK TRANSACTION
прямо перед началом, просто чтобы убедиться, что активной транзакции еще нет, она завершится неудачно с кодом возврата 5 («Файл базы данных заблокирован»).
Есть у кого-нибудь идея?Как подойти к этой проблеме или есть идея, что может вызвать ее?
РЕДАКТИРОВАТЬ: Есть обходной путь: Если происходит описанная ошибка, я закрываю и снова открываю соединение БД.Это решает проблему, но я в настоящее время затрудняюсь понять, почему это так.