Як запобігти блокування бази даних SQLite?


11

З FAQ про SQLite я знав, що:

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

Отже, наскільки я розумію , я можу: 1) Читання БД з декількох потоків ( SELECT) 2) Читання дб з декількох потоків ( SELECT) і запис з однієї нитки ( CREATE, INSERT, DELETE)

Але я читав про " Записування вперед" журналу, що забезпечує більше одночасності, оскільки читачі не блокують авторів, а автор не блокує читачів . Читання та письма можуть тривати одночасно.

Нарешті, я повністю заплутався, коли знайшов його , коли вказано:

Ось інші причини отримання помилки SQLITE_LOCKED:

  • Спроба CREATEабо DROPтаблиця або індекс, поки SELECTвиписка ще очікує.
  • Спроба записати в таблицю, коли a SELECTактивний у цій самій таблиці.
  • Намагаючись зробити два SELECTв одній таблиці одночасно в багатопотоковому додатку, якщо sqlite не встановлений для цього.
  • fcntl (3, виклик F_SETLK у файлі DB виявляється невдалим. Наприклад, це може бути викликано проблемою блокування NFS. Одним з рішень для цієї проблеми є відміняти БД та скопіювати його назад, щоб він мав нове значення Inode

Отже, я хотів би уточнити для себе, чи варто уникати блокування? Чи можу я читати і писати одночасно з двох різних тем? Дякую.

Відповіді:


9

Ця сторінка, на яку ви пов’язані, окрім того, що є досить старою, розповідає про доступ до одного процесу через те саме підключення до бази даних (або через багатосторонні з'єднання в режимі спільного кешу , яким ви не повинні користуватися).

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

У режимі WAL письменник та читачі не блокують один одного, але все одно дозволений лише один автор.


1
Що не так у режимі спільного кешування? Мені вдалося отримати кілька потоків python за один і той же процес, щоб записати його в таблицю через паралель завдань Parallel for loop . У мене були проблеми з блокуванням до набору, isolation_level=Noneхоча. Як я можу поділитись екземплярами між потоками без режиму спільного кешу?
Justin Dearing

1
Документація описує недоліки. Це особливо небезпечно, якщо ви не знаєте, як уникнути тупиків.
ЗР.

Заходьте дуже пізно на вечірку, але це посилання корисне. manski.net/2012/10/sqlite-performance
infocyde
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.