Проблема многопоточности Android SQLite

Я постараюсь быть ясным, но если понадобится больше деталей о коде, я могу предоставить его.

У нас есть приложение ABC, которое предоставляет доступ к Db через помощники. Клиентское приложение XYZ выполняет вызовы IPC для реализации DAO в приложении ABC. Такие команды, как select, insert, update и delete, работают очень хорошо, но когда мы вызываем эти команды в транзакции, у нас возникает проблема.

По сути, при первом вызове SQLiteDatabase.beginTransaction() - через один объект связывания - устанавливается новая транзакция на SQLite, и метод SQLiteDatabase.inTransaction() возвращает true. Затем, когда мы вызываем anyDAO.insert(...), проверка inTransaction () возвращает false.

Мы обнаружили, что первый вызов (beginTransaction) был выполнен в службе в TID #1 потока, а второй (insert) в другом TID #2 потока. Измените код (только для выполнения теста), чтобы сделать beginTransaction и вставить в один вызов IPC сработало, но нам нужно вызвать отдельно.

Вопрос: готов ли SQLite обрабатывать транзакции и команды SQL в разных потоках?

1 ответ

Из документации по SQL:

SQLite поддерживает неограниченное количество одновременных читателей, но в любой момент времени может работать только один писатель. Для многих ситуаций это не проблема. Писатель в очереди. Каждое приложение выполняет свою работу с базой данных быстро и движется дальше, и никакая блокировка не длится более нескольких десятков миллисекунд. Но есть некоторые приложения, которые требуют большего параллелизма, и эти приложения, возможно, должны искать другое решение.

Причина в том, что SQLite не поддерживает "реальный" параллелизм, как другие реляционные СУБД, даже если операции записи выполняются для разных данных.

Итак, если вашему приложению требуется много одновременных (обновляющих) операций, вам следует подумать об использовании другого инструмента.

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