2009-06-17 2 views
37

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

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

ответ

42

От его Wikipedia page:

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

Точнее, от его FAQ:

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

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

38

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

+4

Это лучше, чем принятый ответ, который был написан до того, как был доступен режим WAL. – Stretch

Смежные вопросы