Ami*_*ngh
9
sqlite
android
android-room
最近我开始在我的 android 应用程序中使用房间数据库。尝试从多个线程访问数据库时遇到一些问题。我在所有线程中使用相同的数据库实例。
- 据我所知,如果所有线程都具有相同的数据库实例,那么数据库访问将被序列化。我在一篇博客中读到,在序列化模式下,只有一个线程可以在数据库中读写。然而,根据sqlite文档, read 启用共享锁,因此多个线程可以同时读取。那么,当使用单个 db 实例时,是否遵循允许多次读取和一次写入操作的 sqlite 的默认锁定标准?
- 根据sqlite docs,在写入数据库时首先启用保留锁,如果任何其他写入操作尝试获取保留锁,则写入尝试失败并且db返回SQLITE_BUSY。但是,如果我因此尝试从不同的线程运行两个写入操作,则永远不会收到此错误。这是否意味着写入操作已排队并保证我们永远不会收到 SQLITE_BUSY 错误,因此写入操作永远不会失败?
- 我正在一个线程(Thread1)中执行长插入操作(@Insert)并在另一个线程(Thread2)中读取数据库。如果我在 Thread1 之后启动 Thread2,则读取操作不会返回 Thread1 中新插入的数据,因此读取发生在插入之前。发生这种情况是因为最初写入启用保留锁,并且在此期间可以获取新的共享锁@sqlite docs。
抱歉问了一个很长的问题。