当前位置:   article > 正文

QSqlError(“5“, “Unable to fetch row“, “database is locked“)问题解决_unable to fetch row", "database is locked

unable to fetch row", "database is locked

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 总结原因

    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
    1. 多线程读写数据库都会产生这个问题;(这个原因只是某一个博主的说法,上面两个结合sqlite的特性总结得出);

1.2 解决方案:

    1. 将写数据库事务屏蔽掉再测试,老化测试几天,问题不再复现。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/634803
推荐阅读
相关标签
  

闽ICP备14008679号