Нормально ли получить SQLITE_BUSY для базы данных только для чтения? - PullRequest
2 голосов
/ 21 мая 2010

У меня есть 2 процесса: 1 пишет в базу данных sqlite, 1 читает из той же базы данных. Иногда я получаю SQLITE_BUSY на мои выборы. Это нормально? Это какой-то вариант или способ, которым я мог бы открыть базу данных, чтобы она блокировалась, пока не МОЖЕТ завершить запрос? (Я попробовал опцию FULLMUTEX на открытом вызове, но она, похоже, не имела никакого эффекта).

1 Ответ

2 голосов
/ 21 мая 2010

Когда SQLite необходимо записать, он блокирует всю базу данных, поэтому никакой другой поток / процесс не может прочитать или записать его. Вот почему ваш другой процесс получает SQLITE_BUSY. По этой причине SQLite не так хорош, если вам нужно иметь несколько потоков / процессов, использующих базу данных одновременно. Если у вас есть только два процесса, вы, вероятно, можете обойтись без него.

Что касается второй части вашего вопроса, вы можете указать SQLite повторить попытку с помощью функции sqlite3_busy_timeout , например:

sqlite3_busy_timeout(db, 100);  /* Retry for up to 100 ms */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...