1. QSqlError(“5”, “Unable to fetch row”, “database is locked”)
下面是导致数据库丢失数据的原因分析,供参考。
参考1:https://stackoverflow.com/questions/43160123/qsqlerror5-unable-to-fetch-row-database-is-locked
参考2:https://forum.qt.io/topic/117112/database-is-locked-unable-to-fetch-row
参考3:https://blog.csdn.net/baidu_33850454/article/details/89255917
参考4:https://blog.csdn.net/baidu_31788709/article/details/89605808
1.1 总结原因
-
- 多线程同时写数据库;
-
- 多线程写数据库,当有事务产生时就会出现该问题;
原因:当前上锁逻辑是对数据库API上锁,即开启事务时上锁-事务开启处理完后解锁;插入数据上锁-数据插入执行完解锁;提交事务上锁-提交逻辑处理完解锁;事务处理过程有两次解锁都可能被其它线程去执行写入数据库,所以导致问题出现。
另外下面的解释也可以说明事务容易导致异常:
Begin tran付出的代价是在提交之前,所有SQL语句锁住的资源都不能释放,直到commit掉。可见,如果Begin tran套住的SQL语句太多,那数据库的性能就糟糕了。在该大事务提交之前,必然会阻塞别的语句,造成block很多。 Begin tran使用的原则是,在保证数据一致性的前提下,begin tran 套住的SQL语句越少越好!有些情况下可以采用触发器同步数据,不一定要用begin tran。原文链接:https://blog.csdn.net/u010520146/article/details/81161762
- 多线程写数据库,当有事务产生时就会出现该问题;
-
- 多线程读写数据库都会产生这个问题;(这个原因只是某一个博主的说法,上面两个结合sqlite的特性总结得出);
1.2 解决方案:
-
- 将写数据库事务屏蔽掉再测试,老化测试几天,问题不再复现。