multithreading - 带有Qt的SQLite3中的“Database is locked”错误

标签 multithreading qt sqlite

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

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

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

我的问题是:使用事务时,SQLite3是否不支持同时从数据库中进行读写操作?为什么不简单地等待所有必要的时间来获取锁?也许我没有正确设置?

最佳答案

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

因此,您需要以“BEGIN IMMEDIATE TRANSACTION”启动SQL,其他所有人都必须这样做。

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

bool SqlEngine::beginTransaction()

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

关于multithreading - 带有Qt的SQLite3中的“Database is locked”错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6369677/

相关文章:

java - 将使用线程的列表数组打印到java中的文本区域

c - pthread_exit、pthread_join 和 pthread_detach 之间的区别

c# - 在 C++ 中的两个类之间共享(QList 的)实例

qt - QVision Widget 编译时出错

android - 如何在android中使用 "like"运算符?

sqlite - 在sqlite中获取第n个最高值(value)行

Java EE future 的空指针

C# 使用 System.Threading 发送 SMTP

c++ - QT 中的 INCLUDEPATH 不起作用

c# - Unity错误中的SQLite