Комната: Транзакция с отложенным нарушением ограничения внешнего ключа не завершена - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть База данных комнат с двумя объектами, назовем их 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.

...