我有以下情况:
一种过程是从SQLite数据库读取。
另一个过程是更新数据库。更新不会经常发生,并且所有事务都很短暂。 (平均少于0.1ms)
正在读取的过程应具有较低的查询延迟。 (约0.1毫秒)
如果SQLite的锁定可以像互斥锁或读写器锁那样工作,那么一切都会好的。
通过阅读http://www.sqlite.org/lockingv3.html,这应该是可能的。 SQLite正在使用
LockFileEx(),有时没有LOCKFILE_FAIL_IMMEDIATELY,它将阻止调用
根据需要进行处理。
但是我不知道如何使用/配置SQLite来实现此行为。使用繁忙的处理程序
将涉及轮询,这是 Not Acceptable ,因为在Windows上,最小 sleep 时间通常为15ms。
我希望查询在更新事务结束后立即执行。
是否可以在不更改SQLite的源代码的情况下进行。如果没有,是否在某个地方有这样的补丁?
最佳答案
SQLite不使用仅在释放锁之前会等待的同步机制。
SQLite从不使用阻塞锁定调用。当发现数据库已锁定时,它将等待一段时间,然后重试。
(您可以安装自己的busy handler以等待更短的时间。)
防止读者和作者相互阻塞的最简单方法是使用WAL mode。
如果无法使用WAL模式,则可以通过实现自己的同步机制来同步事务:在所有进程中使用通用的named mutex,并将其锁定在所有事务周围。
(如果您有多个阅读器,这会减少并发性。)