转载:https://www.cnblogs.com/lijingcheng/p/4454884.html

转载:https://blog.csdn.net/venchia_lu/article/details/50456142

转载:https://blog.csdn.net/guofu8241260/article/details/36378291

转载:https://www.jianshu.com/p/15051fbd5a35?utm_campaign

转载:http://www.cnblogs.com/hustcat/archive/2009/03/01/1400757.html

转载:https://www.cnblogs.com/xienb/p/3455562.html(相同的项目场景)

转载:http://www.cnblogs.com/gfxxbk/p/5469200.html(错误码)

转载:https://www.cnblogs.com/feng9exe/p/10682567.html(sqlite线程模型)

转载:https://www.cnblogs.com/cchust/p/5121559.html(API详细介绍)

最近项目中涉及到sqlite并发读写的问题,先搞清楚sqlite3自身的机制。

1.sqlite3支持多线程同时读操作,但不支持多线程同时写操作。

2.同一时刻只能有一个线程去进行写操作,并且在一个线程进行写操作的时候,其他线程是不能进行读操作的。

当一个线程正在写操作时,其他线程的读写都会返回操作失败的错误,显示数据库文件被锁住。

3.sqlite3的锁类型

sqlite3总共有三种事务类型:BEGIN [DEFERRED /IMMEDIATE / EXCLUSIVE] TRANSCATION,五种锁,按锁的级别依次是:UNLOCKED /SHARED /RESERVERD /PENDING /EXCLUSIVE。

当执行select即读操作时,需要获取到SHARED锁(共享锁);

当执行insert/update/delete操作(即内存写操作时),需要进一步获取到RESERVERD锁(保留锁),当进行commit操作(即磁盘写操作时),需要进一步获取到EXCLUSIVE锁(排它锁)。

对于RESERVERD锁,sqlite3保证同一时间只有一个连接可以获取到保留锁,也就是同一时间只有一个连接可以写数据库(内存),但是其它连接仍然可以获取SHARED锁,也就是其它连接仍然可以进行读操作(这里可以认为写操作只是对磁盘数据的一份内存拷贝进行  修改,并不影响读操作)。

对于EXCLUSIVE锁,是比保留锁更为严格的一种锁,在需要把修改写入磁盘即commit时需要在保留锁/未决锁的基础上进一步获取到排他锁,顾名思义,排他锁排斥任何其它类型的锁,即使是SHARED锁也不行,所以,在一个连接进行commit时,其它连接是不能做任何操作的(包括读)。

PENDING锁(即未决锁),则是比较特殊的一种锁,它可以允许已获取到SHARED锁的事务继续进行,但不允许其它连接再获取SHARED锁,当已存在的SHARED锁都被释放后(事务执行完成),持有未决锁的事务就可以获得commit的机会了。sqlite3使用这种锁来防止writer starvation(写饿死)。

sqlite3只支持库级锁,库级锁意味着什么?——意味着同时只能允许一个写操作,也就是说,即事务T1在A表插入一条数据,事务T2在B表中插入一条数据,这两个操作不能同时进行,即使你的机器有100个CPU,也无法同时进行,而只能顺序进行。表级都不能并行,更别说元组级了——这就是库级锁。但是,SQLite尽量延迟申请X锁,直到数据块真正写盘时才申请X锁,这是非常巧妙而有效的。

4.解决方案

对于多线程写数据库的情况,Sqlite3不能实现同时写,但是可以实现串行写数据,也就是一个线程在写的时候,其他线程等待,第一个线程写完的时候,另一个线程获得数据库文件锁开始写。Sqlite3提供了接口sqlite3_busy_handler(),来实现多线程串行写数据。BusyHandler其实是一个回调函数。也就是当A线程正在写操作时,其他线程写失败时进行的重试操作,其他线程不断地调用BusyHandler来进行一些处理,直到自己获得写权限之后。

转载于:https://www.cnblogs.com/chechen/p/10768146.html

sqlite3出现SQLITE_BUSY错误码的原因以及解决方法相关推荐

  1. IIS FTP部分文件上传报错451的原因及解决方法

    最近部署一个基于IIS7的ftp服务器,测试传几个文件遇到问题了,部分文件可以正常上传,但部分报错.下面与大家分享下造成的原因及解决方法 最近部署一个基于IIS7的ftp服务器,添加一个组的用户具有上 ...

  2. git did not exit cleanly(exit code 128)报错的部分原因及解决方法

    今天用tortoisegit同步新的文件到github上的时候出现了git did not exit cleanly的报错,分析原因可能是网络出现问题或者是因为当时文件还处于打开状态就上传了. 对此, ...

  3. 使用TerminateProcess结束进程时,错误码为5的解决方法

    最近在win7上,VS2010开发环境中,写一个守护进程的程序,程序内容:发现目标进程挂起后,将其kill,然后重启. 可是,遇到了一个问题,就是在使用TerminateProcess进行kill目标 ...

  4. 微信小程序各错误码及原因自用表

    微信小程序各错误码及原因自用表 错误号 错误原因 -401001 无权限使用 API -401002 API 传入参数错误 -401003 API 传入参数类型错误 -402001 检测到循环引用 - ...

  5. python打包软件后报错 :SyntaxError: Non-UTF-8 code starting with ‘\x90‘ in file 的原因及解决方法

    本篇文章主要讲解,python打包软件后报错 :SyntaxError: Non-UTF-8 code starting with '\x90' in file 的原因及解决方法 作者:任聪聪 报错说 ...

  6. canvas生成图片toDataURL报错的原因和解决方法

    canvas生成图片toDataURL报错的原因和解决方法 参考文章: (1)canvas生成图片toDataURL报错的原因和解决方法 (2)https://www.cnblogs.com/suna ...

  7. Oracle 报错 28000原因和解决方法

    Oracle 报错 28000原因和解决方法 使用PLSQL登录Oracle数据库时提示"ORA-28000:这个帐号被锁定". 出现这个问题的原因是:在Oracle databa ...

  8. windows下 python 使用 pip 安装TA-Lib报错的原因及解决方法

    windows下 python 使用 pip 安装TA-Lib报错的原因及解决方法 问题环境 问题描述 问题原因 & 解决办法 问题环境 Windows 10 x64 .python 3.8. ...

  9. 计算机开机故障报错,笔记本电脑开机报错故障的原因及解决办法

    笔记本电脑开机报错故障是指笔记本电脑开机自检时或启动操作系统前停止启动,在显示屏 出现一些错误提示的故障. 笔记本电脑开机报错故障的原因及解决办法 造成此类故障的原因一般是笔记本电脑在启动自检时,检测 ...

最新文章

  1. NBT:牛瘤胃微生物组的参考基因组集
  2. linux 5 防火墙,CentOS 5 Linux iptables防火墙的配置
  3. 配置文件加载优先级和外部配置文件加载||IDEA外部配置文件无法加载
  4. Python之路【第八篇】:Python模块
  5. CV之FR:DIY脚本通过人脸图像得到人脸特征向量并输出多张人脸图片之两两图片之间的距离
  6. 小ck活动机器人包包_别只知道小 CK!这 5 款小众包包更值得买
  7. USB On-The-Go引脚
  8. 简单搭配(Collocation)隐私声明
  9. 在hibernate框架中,自己如何使用框架自己生成建表语句
  10. 信息论与贝叶斯(二)
  11. python创建数据集_python 生成环形人工数据集
  12. ie8打完补丁重启报错
  13. 基于动力学前馈加反馈线性化的机器人动力学控制实现
  14. 如何搭建威纶通触摸屏与S7-200smart之间无线PPI通信?
  15. 【AI视野·今日CV 计算机视觉论文速览 第209期】Mon, 31 May 2021
  16. 谓词公式与量词的辖域
  17. not a valid identifier
  18. 用计算机弹奏七月上,七月上歌词背后的故事 七月上背景故事介绍
  19. 双系统(ubuntu系统与window系统)时间不一致的解决办法
  20. 爱伦·坡:写作的哲学

热门文章

  1. JDK源码下载:http://download.java.net/openjdk/jdk7
  2. 赚钱不能莫良心,苍天有眼都在看 -----至张玮
  3. es ik 多字段查询_SpringBoot使用注解的方式构建Elasticsearch查询语句,实现多条件的复杂查询...
  4. After Effects Duik: Rigging Animation Tools After Effects 的绑定与动画工具 Duik插件 Lynda课程中文字幕
  5. 用apline-linux创建的tomcat容器中查看catalina.out日志中文乱码问题解决
  6. 资金、时间、盈利“三杀坎”,外卖尾部平台如何求生?
  7. 常用的设计模式(七)——门面设计模式
  8. 今日金融词汇---年报,是什么?
  9. 奶爸日记24 白砂糖
  10. 微信小程序 Picker-view背景透明设置