读取事务:https://www.sqlite.org/isolation.html
我们假设WAL是启用的,这样我们就可以在一个脚印中阅读,而另一个正在编写。
我想要实现的是这样的东西。
我有两个线程,一个是有时执行db读取的UI线程,另一个是在事务中执行db读/写的db线程。
UI线程中的结果是缓存的,有时有不完整的信息,比如对于一个列表,我们只查询列表的大小,或者只查询该查询的前10项,然后当UI到达该部分时,我们会以更多的方式加载。
在db线程上,我们将执行事务并记住所有更改,然后post (UI线程是一个活套线程)对UI线程的更改并增量地更新UI缓存,以便它尽可能少地阻塞UI线程。
问题是,当db事务完成时,UI线程可能会在活套线程处理该消息之前触发UI线程上的DB读取,也由于UI框架工作的某些限制,我们无法更新缓存,因为UI线程目前正在使用它。
所以我的想法是在UI线程上,在任何查询发生之前,开始一个读事务(在延迟模式下开始一个事务,这个事务不会锁定数据库,因为没有写),然后UI线程中发生的任何读取都会发生在这个事务中,然后活套线程获得更新信息,结束事务,更新缓存,然后开始另一个。因此,数据库和缓存在UI线程中被转换为新的状态,并且是同步的。
所以,我能让一个读事务打开很长时间吗?
发布于 2016-03-28 06:55:00
所有读取都在事务中完成(如果需要,自动读取),所有事务都锁定数据库。但是,WAL模式中的只读锁只阻塞检查点操作.
拥有一个长时间的活动事务是没有问题的,只要不断增长的WAL文件不会溢出磁盘。如果您需要为您的应用程序正确工作的事务,您没有选择无论如何-替代将是实现一些类似的事务机制,更好地让数据库处理这一点。
https://stackoverflow.com/questions/36256862
复制相似问题