如何检查SQLite数据库是否被锁定

4

我有一个应用程序,它会频繁地调用本地SQLite3数据库,有时这些调用非常接近(来自应用程序的不同区域)。在进行数据库调用之前,如何检查数据库是否被锁定?

理想情况下,我会重写这个应用程序(已经远远超出了最初的范围),但在这个迭代中没有时间。


没有必要在调用之前进行检查(如果可能的话),因为它仍然可能会在检查和下一次调用之间被锁定。更好的方法是进行调用,并处理可能的异常,例如重试多次并在过多重试后报告错误。 - Gerard H. Pille
我的当前解决方法是持续尝试(在循环中),直到数据库不再被锁定,但我想知道是否更好的方法是检查数据库是否当前被锁定,如果是,则等待1秒钟后再次尝试。 - Agamemnon
你的测试可以是一个"BEGIN IMMEDIATE",有效地启动一个事务。然后你就可以确保自己拥有锁定。 - Gerard H. Pille
1个回答

4

我对 objective-c 没有任何头绪,但我已经用 c 已经使用了相当长的时间,并且也遇到了相同的问题。我使用以下方法:

  1. 使用busy_timeout并保持可配置性。
  2. 使用busy_handler进行重试直到达到 n 次为止。

这两个改进对我来说效果很好,但我观察到一些性能问题,我可以通过以上配置参数处理。您需要在容错和性能之间做出一些权衡。


1
听起来像是我需要的东西。可惜 sqlite3 对象没有“currentStatus 属性或类似的东西。” - Agamemnon
@Ryan,很抱歉,不行。 - Manthan Tilva
最终,这就是我所做的。添加了一个busy_timeout,在重试之前有效地倒计时一小段时间(如果数据库繁忙)。 - Agamemnon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接