Android Room崩溃无法在事务内启动事务

问题描述 投票:0回答:1

我的 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% 的用户崩溃。

android android-room
1个回答
0
投票

您必须将

TransactionScope
PooledConnection
一起使用,以避免这种竞争情况。

© www.soinside.com 2019 - 2024. All rights reserved.