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


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

2 53

2 ответа:

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

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