是否可以在SQLite中长时间保持读取事务处于打开状态?

时间:2016-03-28 06:02:39

标签: java android multithreading sqlite transactions

阅读交易:https://www.sqlite.org/isolation.html

我们假设WAL已启用,因此我们可以在一个步骤中读取而另一个正在写入。

我想要实现的是这样的。

我有两个线程,一个是有时执行db read的UI线程,另一个是db线程,它在事务中执行db read / write。

UI线程中的结果是缓存的,有时信息不完整,比如列表中的内容,我们只查询列表的大小,或只查询该查询的前10项,然后我们在UI时加载更多到达那一部分。

在db线程上,我们将执行事务并记住所有更改,然后发布(UI线程是一个looper线程)对UI线程的更改并逐步更新UI缓存,以便尽可能少地阻止UI线程

问题是当db事务完成时,UI线程可能会在looper线程处理该消息之前触发UI线程上的DB读取,也是由于UI框架工作的一些限制,我们无法更新缓存,因为UI线程目前正在使用它。

所以我的想法是在UI线程上,在任何查询发生之前,开始读取事务(以延迟模式开始事务,并且此事务不会因为没有写入而锁定数据库),然后任何读取都发生在UI线程将在此事务中发生,然后looper线程获得更新信息,结束事务,更新缓存,并开始另一个。因此,数据库和缓存在UI线程中转换为新状态,并且已同步。

那么我可以长时间保持阅读交易吗?

1 个答案:

答案 0 :(得分:0)

所有读取都在事务中完成(如果需要,则自动完成),并且所有事务都锁定数据库。但是,WAL模式下的只读锁定仅阻止checkpoint operations

长时间活动事务没有问题,只要不断增长的WAL文件不会溢出磁盘。 如果你的应用需要交易才能正常工作,你无论如何也别无选择 - 另一种选择是手工实现一些类似的交易机制,更好的让数据库处理这个。