我有一个使用sqlite(3.7.3)的多线程应用程序
我正在点击数据库锁定错误,这似乎很普遍.我想知道如何在我的情况下避免它.
让我来描述一下我正在建设什么.对不起,没有代码太大而复杂.
我有大约8个线程同时访问数据库.这些线程中的任何一个都可以同时读取或写入.
数据库中表中的每一行都有一个指向资源的文件路径+与该资源相关的其他属性.
3个领域是读者,状态和德尔.
每次线程从资源读取时,读取器都会递增,但仅当status> 0且del = 0时才会递增.
所以我有一些SQL
UPDATE resource set readers=readers+1 where id=? AND del=0 AND status>0
Run Code Online (Sandbox Code Playgroud)
之后,我检查更新的行数.它应该只有1.之后我尝试用选择读回行.我这样做即使它无法更新,因为我需要知道它失败的原因.
我尝试在事务中包装更新和选择,但这没有帮助.我已经检查过我正在调用我的陈述.
现在,我认为默认情况下sqlite序列化.我尝试了几种开放模式,但我仍然得到同样的错误.
在你问之前,不,我不打算去mysql.我绝对需要零配置.
有人可以提供一些关于如何避免此类问题的指示吗?我应该将读卡器锁移出数据库吗?如果我这样做,我应该用什么机制替换它?我在C++下使用Linux并且可以使用boost库.
编辑:有趣的是,在我更新的调用后添加COMMIT显着改善了事情.
当您打开数据库时,您应该配置“繁忙超时”
int sqlite3_busy_timeout(sqlite3*, int ms);
Run Code Online (Sandbox Code Playgroud)
http://www.sqlite.org/c3ref/busy_timeout.html
| 归档时间: |
|
| 查看次数: |
5011 次 |
| 最近记录: |