我在嵌入式系统和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/