最近项目中涉及到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来进行一些处理,直到自己获得写权限之后。

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

  1. sqlite3出现SQLITE_BUSY错误码的原因以及解决方法

    转载:https://www.cnblogs.com/lijingcheng/p/4454884.html 转载:https://blog.csdn.net/venchia_lu/article/de ...

  2. Java读带有BOM的UTF-8文件乱码原因及解决方法(转)

    转载:http://www.linuxidc.com/Linux/2012-12/76707.htm 最近在处理文件时发现了同样类型的文件使用的编码可能是不同的.所以想将文件的格式统一一下(因为UTF ...

  3. Java读取UTF-8格式txt文件第一行出现乱码及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法(转载)...

    原文地址:http://blog.csdn.net/jackpk/article/details/5702964/ Java读取UTF-8的txt文件第一行出现乱码"?"及解决 t ...

  4. Java读带有BOM的UTF-8文件乱码原因及解决方法

    Java读带有BOM的UTF-8文件乱码原因及解决方法 Java读带有BOM的UTF-8文件乱码原因及解决方法 - daimojingdeyu - ITeye技术网站 Java读带有BOM的UTF-8 ...

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

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

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

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

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

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

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

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

  9. java内存溢出原因及解决_java内存溢出的原因和解决方法

    java内存溢出的原因和解决方法 发布时间:2020-06-15 17:57:39 来源:亿速云 阅读:85 作者:元一 内存溢出含义: 内存溢出(out of memory)通俗理解就是内存不够,通 ...

  10. pip安装kolla-ansible时报错Cannot install ‘PyYAML‘的解决方法

    pip安装kolla-ansible时报错Cannot install 'PyYAML'的解决方法 参考文章: (1)pip安装kolla-ansible时报错Cannot install 'PyYA ...

最新文章

  1. hdu 3729(二分图最大匹配+最大字典序)
  2. javascript动态创建table
  3. 阿里云高校“在家实践”计划,免费提供2.68亿小时算力!
  4. MongoDB 副本集管理
  5. 解决ModuleNotFoundError: No module named ‘_curses‘错误
  6. Python查找所有类似于123-45-67+89 = 100的组合
  7. 有关java中的集合List,set,Map 等
  8. 计算机基础教程有access2010,Access2010数据库案例教程
  9. 电信光猫获取超级账户和密码
  10. HFSS求解类型和求解设置
  11. 万丈高楼平地起,基础很重要
  12. iOS新增3DTouch分享app菜单 (#原来iphone可以称重# ​ )
  13. IP地址划分与子网掩码
  14. 连续函数的最佳平方逼近
  15. Linux 时间校准与同步
  16. js手机端 下拉刷新
  17. STM32CUBEIDE小技巧: Bookmark 书签
  18. 07、人人都会设计模式:建造者模式--Builder
  19. 韩老师——数据结构与算法—单链表的生成及增删改查操作和常见关于链表的面试题java代码实现
  20. 小白学java之车辆管理系统,超基础!

热门文章

  1. 需求分析——系统建模方法
  2. Spark SQL操作JSON字段小Tips
  3. 众测、专属、渗透测试捡破烂小tips
  4. 未来真的可以影响过去吗?人人都能看懂的波粒二象性和延迟选择量子擦除实验解释,通俗易懂量子物理
  5. Spring MVC整合FreeMarker
  6. 显示硬件发展与视频开发系列(6)----显示标注与视频处理单元(4):GPGPU
  7. 提供AlTi5B催化富铝合金水解产氢材料/Ru/Ce(OH)CO3纳米材料/Al-Ga-Mg-Sn多元铝合金
  8. 计算机维修与数据恢复论文,备份恢复论文,关于计算机数据备份数据恢复技术相关参考文献资料-免费论文范文...
  9. java高并发解决方案
  10. OSChina 周三乱弹 —— 你们的女神宣布结婚了