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