Будет ли база данных SQLite заблокирована, когда какая-либо функция приостановки будет работать с ней в Android?

Я использую SQLite с комнатой в своем проекте Android Studio.

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

Будет ли заблокирована база данных SQLite?

0
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Будет ли заблокирована база данных SQLite?

Да.

Обычно Room будет использовать WAL (упреждающая запись), а не режим журнала. то есть по умолчанию API 16+ будет использовать WAL, а в API 16 будет использоваться режим журнала.

  • С помощью WAL изменения вносятся в отдельный файл (имя файла базы данных имеет суффикс -wal). Иногда изменения будут применяться к фактическому файлу базы данных (с контрольными точками). Откат — это, по сути, удаление данных из файла -wal.
  • При создании журнала изменения применяются к файлу базы данных, и сохраняется запись (журнал). Откат — это процесс отмены изменений, внесенных в файл базы данных.

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

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

Конечно, неявно с вышеупомянутыми писателями (LOCK) блочные писатели. Объясняется позже в документации: -

Писатели просто добавляют новый контент в конец файла WAL. Поскольку писатели не делают ничего, что могло бы помешать действиям читателей, писатели и читатели могут работать одновременно. Однако, поскольку существует только один файл WAL, в каждый момент времени может быть только один модуль записи.

Неявно, как и следовало ожидать, читатели не блокируют читателей.

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

Если вы используете режим журнала, см. setJournalMode , тогда параллелизм (блокировка) является более строгим, см. Блокировка файлов и параллелизм

Спасибо! Как избежать блокировки SQLite при использовании Room? Вы знаете, что функции приостановки в фоновой службе вышли из-под контроля, вы не знаете, когда запускается функция приостановки для изменения записей.

HelloCW 15.05.2023 02:52

@HelloCW, отсюда и ссылка на Составление приостанавливающих функций.

MikeT 15.05.2023 03:15

Другие вопросы по теме