gpt4 book ai didi

c++ - 避免 sqlite3 数据库锁定

转载 作者:IT王子 更新时间:2023-10-29 00:57:12 27 4
gpt4 key购买 nike

我有一个使用 sqlite (3.7.3) 的多线程应用程序

我遇到了似乎相当普遍的数据库锁定错误。我想知道如何在我的案例中避免它。

让我描述一下我正在构建的内容。抱歉,没有代码,它太大太复杂。

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

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

注意的三个字段是readers、status和del。

每次线程从资源中读取时,Readers 都会递增,但前提是 status > 0 且 del = 0。

所以我有一些 SQL 可以执行

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

之后,我检查更新的行数。它应该只有 1。之后,我尝试用一​​个选择来读回该行。即使失败了我也会这么做进行更新,因为我需要知道失败的原因。

我尝试将更新和选择都包装在一个事务中,但这没有帮助。我已经检查过我是否也在对我的陈述进行定稿。

现在,我认为 sqlite 默认是序列化的。我尝试了几种打开模式,但仍然出现相同的错误。

在你问之前,不,我不打算去 mysql。我绝对需要零配置。

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

编辑:有趣的是,在我更新的调用之后添加 COMMIT 会显着改善情况。

最佳答案

当你打开数据库时,你应该配置'busy timeout'

int sqlite3_busy_timeout(sqlite3*, int ms);

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

关于c++ - 避免 sqlite3 数据库锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4101837/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com