我的 Android 应用程序中有一个房间数据库。 最近的更改导致崩溃:
Fatal Exception: android.database.sqlite.SQLiteException: cannot start a transaction within a transaction (code 1 SQLITE_ERROR[1])
at android.database.sqlite.SQLiteConnection.nativeExecute(SQLiteConnection.java)
at android.database.sqlite.SQLiteConnection.execute(SQLiteConnection.java:1033)
at android.database.sqlite.SQLiteSession.beginTransactionUnchecked(SQLiteSession.java:321)
at android.database.sqlite.SQLiteSession.beginTransaction(SQLiteSession.java:300)
at android.database.sqlite.SQLiteDatabase.beginTransaction(SQLiteDatabase.java:970)
at android.database.sqlite.SQLiteDatabase.beginTransactionNonExclusive(SQLiteDatabase.java:904)
at androidx.sqlite.db.framework.FrameworkSQLiteDatabase.beginTransactionNonExclusive(FrameworkSQLiteDatabase.kt:59)
at androidx.room.RoomDatabase.internalBeginTransaction(RoomDatabase.kt:527)
at androidx.room.RoomDatabase.beginTransaction(RoomDatabase.kt:511)
at myapp.data.dao.DocumentDao_Impl$updatePosition$2.call(DocumentDao_Impl.java:1576)
at myapp.data.dao.DocumentDao_Impl$updatePosition$2.call(DocumentDao_Impl.java:1566)
at androidx.room.CoroutinesRoom$Companion$execute$2.invokeSuspend(CoroutinesRoom.kt:64)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
at androidx.room.TransactionExecutor.execute$lambda$1$lambda$0(TransactionExecutor.java:36)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
at java.lang.Thread.run(Thread.java:1012)
调用的dao是:
@Query("update document set bookmarkLocation=:position, bookmarkLength=:length where documentId=:documentId")
abstract suspend fun updatePosition(
documentId: String,
position: Int,
length: Int
)
它不使用交易。 上面没有任何东西可以启动事务。 该实体没有什么棘手的。 我不明白,我广泛使用 Room。 为什么这个简单的更新会引起问题? 这种情况正在生产中发生。 我在测试中没有看到它。 在生产中,它导致大约 1% 的用户崩溃。