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

87

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

sean717
источник
связанный вопрос см. здесь .. stackoverflow.com/questions/12117016/…
AndroidGeek

Ответы:

142

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

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

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

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

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

sean717
источник
поэтому гипотетически, если вам нужно было решить проблему, в которой вам нужны данные локально, не делая их доступными для широкой публики, но имея возможность записывать несколько файлов параллельно, вам понадобится один файл базы данных для каждой такой записи, чтобы несколько записей могли происходить одновременно. это? Я знаю, что несколько файлов обычно не одобряются, но я пытаюсь найти способ выполнять несколько
операций
Существует прагма lock_mode = exclusive, которую можно использовать для блокировки базы данных для одного процесса, если вы хотите запретить эту функцию.
Scovetta
20

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

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

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

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

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

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

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

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

int sqlite3_enable_shared_cache (интервал);

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

Арун
источник