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