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

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

2 ответов


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

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

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

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

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


sqlite3 для того, разрешая несколько соединений:

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

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

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

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

в версии 3.5.0, режим общего кэша был изменен так, что то же самое кэша может быть общим для всего процесса, а не только в один поток.

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 () переопределяет все предыдущие вызовы в рамках того же процесса.