sqlite db остается заблокированным / недоступным - PullRequest
4 голосов
/ 14 октября 2011

У меня проблема с базой данных 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 («Файл базы данных заблокирован»).

Есть у кого-нибудь идея?Как подойти к этой проблеме или есть идея, что может вызвать ее?

РЕДАКТИРОВАТЬ: Есть обходной путь: Если происходит описанная ошибка, я закрываю и снова открываю соединение БД.Это решает проблему, но я в настоящее время затрудняюсь понять, почему это так.

Ответы [ 2 ]

0 голосов
/ 14 октября 2011

Соединения SQLite следует использовать только из одного потока , поскольку среди прочего они содержат мьютексы, которые используются для обеспечения правильного одновременного доступа. (Имейте в виду, что SQLite в любом случае поддерживает только один поток обновления одновременно и без одновременных чтений в то время; это ограничение того, чтобы быть БД без сервера.)

К счастью, соединения SQLite относительно дешевы, когда они ничего не делают, а стоимость таких вещей, как подготовленные в кэше операторы, на самом деле довольно мала; откройте столько, сколько вам нужно.

[EDIT]: Более того, это объясняет закрытие и повторное открытие работ по соединению: оно создает соединение в новом потоке (и завершает все блокировки и т. Д. В старом).

0 голосов
/ 14 октября 2011

Sqlite - это база данных без сервера. Насколько я знаю, он не поддерживает одновременный доступ из нескольких источников. Вы пытаетесь получить доступ к одному и тому же файлу поддержки как из вашего приложения, так и из командного инструмента - поэтому вы пытаетесь выполнить параллельный доступ. Вот почему это терпит неудачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...