Мой код:SQLiteDatabase.endTransaction бросает SQLiteDatabaseLockedException
SQLiteDatabase db = ...;
db.beginTransaction();
try{
db.update(...);
db.setTransactionSuccessful();
}finally{
db.endTransaction();
}
Теперь проблема заключается в том, что endTransaction иногда бросает SQLiteDatabaseLockedException, и я не знаю причину, или как повторить то же самое исключение.
От SQLiteDatabaseLockedException Я читаю:
Брошенный, если двигатель базы данных не удалось приобрести замки базы данных он должен делать свою работу.
И от beginTransaction Я читаю:
Начинает транзакцию в монопольном режиме.
От SQLite manual Я читаю:
монопольная блокировка необходима для того, чтобы писать в файл базы данных. В файл разрешен только один замок EXCLUSIVE, и никакие другие блокировки не могут сосуществовать с блокировкой EXCLUSIVE. Для того, чтобы максимизировать параллелизм, SQLite работает, чтобы свести к минимуму время, которое ЗАКЛЮЧЕНЫ ЭКСКЛЮЗИВ.
Как можно блокировать блокировку DB в endTransaction, когда я держу эксклюзивную блокировку от beginTransaction? Версия для Android, где это происходит, - 4.0.4 (у меня есть отчет о сбое, но я не могу повторить это).
Нужно сказать, что я включил SQLiteDatabase.enableWriteAheadLogging в БД, может быть, это имеет значение? БД для доступа к приложениям в нескольких потоках.
В любом случае, я хотел бы получить ясное объяснение и сделать простой пример, который может повторять условия, повторяющие проблему, так что я могу сделать реальное исправление. Спасибо.
Не должно быть: SQLiteDatabase db = new SQLiteDatabase(); – MrByte
Обновлено до «...», чтобы отметить, что это уже инициализировано. –
@PointerNull, как вам удалось это исправить? –