У мене є база даних SQLite, яка використовується двома процесами. Мені цікаво, з останньою версією SQLite, коли один процес (підключення) запускає транзакцію для запису в базу даних, чи зможе інший процес читати з бази даних одночасно?
У мене є база даних SQLite, яка використовується двома процесами. Мені цікаво, з останньою версією SQLite, коли один процес (підключення) запускає транзакцію для запису в базу даних, чи зможе інший процес читати з бази даних одночасно?
Відповіді:
Я збирав інформацію з різних джерел, в основному з sqlite.org, і складав їх разом:
По-перше, за замовчуванням кілька процесів можуть одночасно відкривати одну і ту ж базу даних SQLite, і паралельно можна задовольнити кілька доступів для читання.
У разі написання, один запис у базу даних блокує базу даних на короткий час, ніщо, навіть читання, не може отримати доступ до файлу бази даних взагалі.
Починаючи з версії 3.7.0, доступна нова опція “Запис вперед” (WAL) , в якій читання та запис можуть тривати одночасно.
За замовчуванням WAL не ввімкнено. Щоб увімкнути WAL, зверніться до документації SQLite.
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 () замінює всі попередні виклики в тому ж процесі.