【问题标题】:"Database is locked" error in SQLite3 with Qt使用 Qt 的 SQLite3 中的“数据库已锁定”错误
【发布时间】:2011-09-16 05:09:21
【问题描述】:

我在嵌入式系统上使用 SQLite3,在 Qt 应用程序中使用 x86。当多个线程尝试读取/写入数据库时​​,我遇到了常见错误“数据库已锁定”。

我阅读了其他答案中建议的 this 文章,但我正在为每个线程创建不同的连接。

通过稍微调整 QSQLITE_BUSY_TIMEOUT 选项(到一个非常大的值:10000000),我在 x86 系统和嵌入式系统上解决了这个问题,但在后一种情况下,仅在不使用事务时才解决。不幸的是,我需要为每个线程的所有工作使用事务。

我的问题是:SQLite3 不支持在使​​用事务时同时读取/写入数据库吗?为什么它不简单地等待所有必要的时间来获取锁?也许我没有正确设置它?

【问题讨论】:

    标签: multithreading qt sqlite


    【解决方案1】:

    读取BEGIN TRANSACTION SQL 语句。它明确表示默认事务行为被延迟,这解释了您看到的错误。另请阅读此link 以获得另一个很好的解释。

    所以你需要以“BEGIN IMMEDIATE TRANSACTION”开始你的SQL,其他人也必须这样做。

    您可以找到源代码示例here。注意

    bool SqlEngine::beginTransaction()
    

    方法并在您的代码中执行相同的操作。

    【讨论】:

    • 我很难理解为什么这是有效的并且 DEFERRED 不好,但是您提供的文档非常清楚,所以我迟早会得到它:-) 无论如何,它是现在工作。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    相关资源
    最近更新 更多