首页 > 解决方案 > android中带有房间数据库的多线程

问题描述

最近我开始在我的 android 应用程序中使用房间数据库。尝试从多个线程访问数据库时遇到一些问题。我在所有线程中使用相同的数据库实例。

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

抱歉问了一个很长的问题。

标签: androidsqliteandroid-room

解决方案


推荐阅读