我有一个使用sqlite (3.7.3)的多线程应用程序。
我遇到了数据库锁定错误,这似乎是相当普遍的。我想知道如何在我的情况下避免这种情况。
让我描述一下我正在构建的内容。抱歉,代码太大太复杂了。
我有大约8个线程同时访问数据库。这些线程中的任何一个都可以同时读取或写入。
数据库中表中的每一行都有一个文件路径,指向资源以及与该资源相关的其他属性。
注释中的3个字段为readers,status和del。
只有当status>0且del=0时,每次线程从资源中读取时,读者才会递增。
所以我有一些SQL执行以下操作:
UPDATE resource set readers=readers+1 where id=? AND del=0 AND status>0
之后,我会检查更新的行数。应该只有1行被更新。
即使更新失败,我也会尝试使用select读取该行。因为我需要知道它失败的原因。
我尝试将更新和选择操作都包含在一个事务中,但这并没有帮助。我已经确认了我在语句结束时调用了finalize函数。
现在,我认为sqlite默认是串行化的。我尝试了几种打开模式,但仍然遇到了相同的错误。
在你问之前,我不打算转向mysql。我绝对需要零配置。
有人能提供一些如何避免这种问题的指导吗?我应该将读者锁移出数据库吗?如果我这样做,我应该用什么机制来代替它呢?我正在使用C++下的Linux,并且有boost库可用。
编辑:有趣的是,在我的更新调用后添加COMMIT可以显著改善情况。