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