У меня есть База данных комнат с двумя объектами, назовем их A и B. Ссылки B через внешний ключ. Внешний ключ настроен на отсрочку до завершения транзакции:
@ForeignKey(entity = A.class, deferred = true, parentColumns = "_id", childColumns = "A_id")
Когда я сейчас пытаюсь удалить строку в A, на которую ссылается строка в B, во время выполнения транзакции (например, с помощью RoomDatabase .runInTransaction ()), транзакция завершается неудачно и генерируется исключение SQLiteConstraintException, как и ожидалось. Однако, когда я пытаюсь запустить другую транзакцию для того же объекта базы данных, я получаю следующее исключение:
android .database.sqlite.SQLiteException: не удается запустить транзакцию внутри транзакции (код 1 SQLITE_ERROR)
Кроме того, в Logcat выводится следующее:
E / SQLiteLog: (1) оператор прерывается на 3: [BEGIN EXCLUSIVE;] не может начать транзакция внутри транзакции
Таким образом, похоже, что первоначальная транзакция не была должным образом завершена в нижележащем слое SQLite при возникновении исключения SQLiteConstraintException. Это намеренное поведение? Из этого состояния, похоже, нет способа завершить основную транзакцию. Вызов RoomDatabase.inTransaction () фактически возвращает false, а RoomDatabase.endTransaction () (который в любом случае помечен как устаревший) не завершает транзакцию.
Я использую Room версию 2.1.0.