QSqlError(“5“, “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. 将写数据库事务屏蔽掉再测试,老化测试几天,问题不再复现。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值