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

Могу ли я читать и писать в базу данных SQLite одновременно из нескольких соединений?

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

4b9b3361

Ответ 1

Я собрал информацию из разных источников, в основном из sqlite.org, и собрал их вместе:

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

В случае записи одна запись в базу данных блокирует базу данных на короткое время, ничто, даже чтение, не может вообще обращаться к файлу базы данных.

Начиная с версии 3.7.0 доступна новая опция Запись в заголовке Ahead (WAL), в которой могут выполняться чтение и запись одновременно.

По умолчанию WAL не включен. Чтобы включить WAL, обратитесь к документации SQLite.

Ответ 2

SQLite3 явно позволяет несколько подключений:

(5) Может ли несколько приложений или несколько экземпляров одного и того же приложение одновременно обращается к одному файлу базы данных?

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

Для совместного использования используйте общий кэш SQLite3:

Начиная с версии 3.3.0, SQLite включает специальный "общий кэш", mode (отключен по умолчанию)

В версии 3.5.0 режим shared-cache был изменен, так что тот же кеш может быть разделен на весь процесс, а не только внутри одиночный поток.

5.0 Включение режима общего кэша

Режим общего кэша включен для каждого процесса. Использование C интерфейс, следующий API может использоваться для глобального включения или отключения режим общего кэша:

int sqlite3_enable_shared_cache (int);

Каждый вызов sqlite3_enable_shared_cache() вызывает последующую базу данных соединения, созданные с использованием sqlite3_open(), sqlite3_open16() или sqlite3_open_v2(). Соединения с базой данных, которые уже существуют, незатронутыми. Каждый вызов sqlite3_enable_shared_cache() отменяет все предыдущие вызовы в рамках одного процесса.