我有以下情况: 一个过程是从SQLite数据库中读取。 另一个过程是更新数据库。更新不会经常发生,并且所有事务都很短。 (平均不到0.1ms) 正在读取的进程应该具有较低的查询延迟。 (约0.1ms)
如果锁定SQLite会像互斥锁或读写器锁一样工作,一切都会好的。 从阅读http://www.sqlite.org/lockingv3.html开始,这应该是可能的。 SQLite正在使用 LockFileEx(),有时没有LOCKFILE_FAIL_IMMEDIATELY,会阻止调用 按需处理。
但是我无法弄清楚如何使用/配置SQLite来实现此行为。使用繁忙的处理程序 将涉及轮询,这是不可接受的,因为Windows上的最小睡眠时间通常为15ms。 我希望在更新事务结束后立即执行查询。
这是否可以在不更改SQLite源代码的情况下实现。如果没有,是否在某处提供了这样的补丁?
答案 0 :(得分:0)
SQLite不使用在释放锁之前等待的同步机制。 SQLite从不使用阻塞锁定调用;当它发现数据库被锁定时,等待一段时间并再次尝试。 (您可以安装自己的busy handler等待更短的时间。)
防止读者和作者互相阻挡的最简单方法是使用WAL mode。
如果您无法使用WAL模式,则可以通过实施自己的同步机制来同步事务:在所有进程中使用通用named mutex,并将其锁定在所有事务周围。 (如果您有多个读者,这会降低并发性。)