У меня есть база данных SQLite, которая используется двумя процессами. Мне интересно, с самой последней версией SQLite, в то время как один процесс (соединение) начинает транзакцию для записи в базу данных, сможет ли другой процесс одновременно считывать данные из базы данных?
Могу ли я читать и писать в базу данных SQLite одновременно из нескольких соединений?
Ответ 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() отменяет все предыдущие вызовы в рамках одного процесса.