Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 避免sqlite3数据库被锁定大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我有一个使用SQLite(3.7.3)的多线程应用程序我正在点击数据库锁定错误,这似乎很普遍.我想知道如何在我的情况下避免它.让我来描述一下我正在建设什么.对不起,没有代码太大而复杂.我有大约8个线程同时访问数据库.这些线程中的任何一个都可以同时读取或写入.数据库中表中的每一行都有一个文件路径,该路径指向资源与该资源相关的其他属性.3个领域是读者,状态和德尔

@L_801_0@一个使用sqlite(3.7.3)的多线程应用程序

我正在点击数据库锁定错误,这似乎很普遍.
我想知道如何在我的情况下避免它.

让我来描述一下我正在建设什么.对不起,没有代码太大而复杂.

@L_801_0@大约8个线程同时访问数据库.这些线程中的任何一个都可以同时读取或写入.

数据库中表中的每一行都有一个文件路径,该路径指向资源与该资源相关的其他属性.

3个领域是读者,状态和德尔.

每次线程从资源中读取时,读取器都会递增,但仅当状态为>时才会递增. 0和del = 0.

所以@L_801_0@一些sql

updatE resource set readers=readers+1 where id=? AND del=0 AND status>0

之后,我检查更新的行数.它应该只有1.
之后我尝试用选择读回行.即使它失败了我也这样做
更新,因为我需要知道它失败的原因.

我尝试在事务中包装更新和选择,但这没有帮助.
我已经检查过我正在调用我的陈述.

现在,我认为认情况下sqlite序列化.我尝试了几种开放模式,但我仍然得到同样的错误.

在你问之前,不,我不打算MysqL.我绝对需要零配置.

有人可以提供一些关于如何避免此类问题的指示吗?我应该将读卡器锁移出数据库吗?如果我这样做,我应该用什么机制替换它?我在C下使用Linux并且可以使用boost库.

编辑:
有趣的是,在我更新的调用之后添加COMMIT可以极大地改进.

最佳答案
打开数据库时,应配置“忙超时”

int sqlite3_busy_timeout(sqlite3*,int ms);

http://www.sqlite.org/c3ref/busy_timeout.html

大佬总结

以上是大佬教程为你收集整理的c – 避免sqlite3数据库被锁定全部内容,希望文章能够帮你解决c – 避免sqlite3数据库被锁定所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。