java—在sqlite中长时间打开读取事务可以吗?

cidc1ykv  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(276)

读取事务:https://www.sqlite.org/isolation.html
我们假设wal是启用的,这样我们就可以在一个踏板上阅读,而另一个踏板正在写作。
我想要达到的是这样的目标。
我有两个线程,一个是ui线程,有时执行db read,另一个是db线程,在事务中执行db read/write。
ui线程中的结果是缓存的,有时会有不完整的信息,比如对于一个列表,我们只查询列表的大小,或者只查询该查询的前10项,然后当ui到达该部分时,我们以增量方式加载更多的内容。
在db thread上,我们将执行事务并记住所有更改,然后将更改发布到ui thread(ui thread是一个looper线程)并增量更新ui缓存,以便尽可能少地阻塞ui thread。
问题是当db事务完成时,ui线程可能会在looper线程处理该消息之前触发ui线程上的db read,同样由于ui框架的某些限制,我们无法更新缓存,因为ui线程当前正在使用它。
所以我的想法是在ui线程上,在任何查询发生之前,开始一个读取事务(在延迟模式下开始一个事务,这个事务不会因为没有写入而锁定数据库),然后在ui线程中发生的任何读取都会发生在这个事务中,然后循环线程得到更新信息,结束事务,更新缓存,然后开始另一个缓存。因此,数据库和缓存在ui线程中被转换为新的状态并同步。
那么我可以让一个read事务长时间打开吗?

2nc8po8w

2nc8po8w1#

所有读取都是在一个事务中完成的(如果需要,可以是自动的),并且所有事务都会锁定数据库。但是,wal模式中的只读锁只会阻止检查点操作。
有一个活动事务很长时间是没有问题的,只要不断增长的wal文件不溢出磁盘。如果你需要事务来让你的应用程序正常工作,你别无选择——另一种选择是手工实现一些类似的事务机制,最好让数据库来处理。

相关问题