sqlite数据库并发怎么解决

sqlite数据库并发怎么解决,第1张

使用SQLite经常会遇到并发处理,要处理好多线程或多进程之间的并发,就得搞清楚SQLite的机制,尤其是Sqlite的锁机制。

因为SQLite是文件数据库,所以它的锁也基本是和文件一致,也即:写独占,读共享。这意味是在读取数据库的时候,是可以多个线程共享的,而如果有增删改的 *** 作,则会独占此文件,其他线程会进程都会被阻塞。

在移动设备上,比较常见的情况是App的UI进程和Service进程同时访问数据库,这个时候就要对其访问做好并发的处理,否则会出现很多意想不到的后果。

SQLite作为一款小型的嵌入式数据库,本身没有提供复杂的锁定机制,无法内部管理多路并发下的数据 *** 作同步问题,更谈不上优化,所以涉及到多路并发的情况,需要外部进行读写锁控制,否则SQLite会返回SQLITE_BUSY错误,以驳回相关请求。

返回SQLITE_BUSY主要有以下几种情况:

1。当有写 *** 作时,其他读 *** 作会被驳回

2。当有写 *** 作时,其他写 *** 作会被驳回

3。当开启事务时,在提交事务之前,其他写 *** 作会被驳回

4。当开启事务时,在提交事务之前,其他事务请求会被驳回

5。当有读 *** 作时,其他写 *** 作会被驳回

6。读 *** 作之间能够并发执行

基于以上讨论,可以看出这是一个典型的读者写者问题,读 *** 作要能够共享,写 *** 作要互斥,读写之间也要互斥

可以设计如下的方案解决并发 *** 作数据库被锁定的问题,同时保证读 *** 作能够保持最大并发

1。采用互斥锁控制数据库写 *** 作

2。只有拥有互斥锁的线程才能够 *** 作数据库

3。写 *** 作必须独立拥有互斥锁

4。读 *** 作必须能够共享互斥锁,即在第一次读取的时候获取互斥锁,最后一次读取的时候释放互斥锁

SQLite 的读写效率很高,有哪些使用其他数据库的理由

1、sqlite定位是嵌入式数据库,只能本地嵌入其它进程来工作,无法被远程的客户端访问,需要上层应用来处理这些事情;

2、sqlite设计上就不是为大数据量考虑的,因此别指望它存海量数据;

3、sqlite适合单线程访问,对多线程高并发的场景不适用;

4、各种数据库高级特性它都不支持,比如管理工具、分析工具、维护等等;

所以还是要根据场景选择合适的数据库,嵌入式用SQLite是相当不错的,但绝大多数场景还是要用MySQL/SqlServer/MongoDB这类的数据库。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10064786.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存