Подтвердить что ты не робот

Блокирует ли SQLite файл базы данных при чтении?

Я изучаю SQLite как механизм хранения, и мне любопытно узнать, блокирует ли SQLite файл базы данных при чтении.

Меня беспокоит производительность чтения, так как у моего запланированного проекта будет мало записей, но многие читают. Если база данных блокируется, существуют ли меры, которые можно предпринять (например, кэширование памяти), чтобы уменьшить это?

4b9b3361

Ответ 1

Из страницы Википедии:

Несколько компьютерных процессов или потоков могут обращаться к одной и той же базе данных без проблем. Несколько запросов на чтение могут выполняться параллельно.

Точнее, из FAQ:

Несколько процессов могут одновременно открывать одну и ту же базу данных. Несколько процессов могут одновременно выполнять SELECT. Однако только один процесс может вносить изменения в базу данных в любой момент времени.

Одна запись в базу данных, однако, блокирует базу данных в течение короткого времени, поэтому ничто не может получить к ней доступ вообще (даже не чтение). Подробности можно найти в Блокировка файлов и Concurrency В SQLite версии 3. В принципе, чтение базы данных не представляет проблемы, если кто-то не захочет немедленно записывать в базу данных. В этом случае БД блокируется исключительно на время, необходимое для выполнения этой транзакции, и блокировка будет выпущена впоследствии. Тем не менее, подробности о том, что именно происходит с операциями чтения на датапазе во время блокировки PENDING или EXCLUSIVE, мало. Я предполагаю, что они либо возвращают SQLITE_BUSY, либо блокируют, пока не смогут их прочитать. В первом случае не следует слишком сложно просто повторить попытку, особенно если вы ожидаете, что несколько записей будут записаны.

Ответ 2

Вы можете избежать блокировок при чтении, если вы установите режим журнала базы данных на запись в журнал записи (см. http://www.sqlite.org/wal.html).