SQLite блокирует файл базы данных на чтение? - PullRequest
42 голосов
/ 17 июня 2009

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

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

Ответы [ 2 ]

49 голосов
/ 16 мая 2012

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

43 голосов
/ 17 июня 2009

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

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

Точнее, из FAQ :

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

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

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