Чи можу я читати та записувати в базу даних SQLite одночасно з декількох з'єднань?


87

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


Пов'язаний з цим питання дивіться тут .. stackoverflow.com/questions/12117016 / ...
AndroidGeek

Відповіді:


142

Я збирав інформацію з різних джерел, в основному з sqlite.org, і складав їх разом:

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

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

Починаючи з версії 3.7.0, доступна нова опція “Запис вперед” (WAL) , в якій читання та запис можуть тривати одночасно.

За замовчуванням WAL не ввімкнено. Щоб увімкнути WAL, зверніться до документації SQLite.


так гіпотетично, якщо вам доводилося вирішувати проблему, коли ви хотіли дані локально, не роблячи їх доступними для широкого загалу, але можливість писати кілька файлів паралельно, вам знадобиться один файл бази даних на таку запис, щоб багаторазові записи могли відбуватися одночасно. є це? Я знаю, що, як правило, нарікають на декілька файлів, але я намагаюся знайти спосіб зробити кілька записів із завдання селери без використання бази даних на стороні сервера, оскільки мені потрібні дані лише для локальних обчислень
PirateApp,

Існує прагма, locking_mode = exclusive, яка може використовуватися для блокування бази даних до одного процесу, якщо ви хочете запобігти цій функціональності.
Сковетта

20

SQLite3 явно дозволяє кілька підключень :

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

Кілька процесів можуть одночасно відкривати одну і ту ж базу даних. Кілька процесів можуть виконувати SELECT одночасно. Але лише один процес може вносити зміни в базу даних у будь-який момент часу.

Для спільного використання з'єднань використовуйте загальний кеш 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 () замінює всі попередні виклики в тому ж процесі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.