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

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

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

2 ответа

Решение

Со страницы Википедии:

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

Точнее, из его FAQ:

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

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

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

Добавление дополнительной информации для этого ответа:

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

A: Нет и да

Ссылка: https://www.sqlite.org/atomiccommit.html

Первый шаг к чтению из файла базы данных - получение общей блокировки файла базы данных. "Совместная" блокировка позволяет двум или более соединениям с базой данных читать из файла базы данных одновременно. Но разделяемая блокировка не позволяет другому соединению с базой данных записывать в файл базы данных, пока мы его читаем.

Другие вопросы по тегам