博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQLite的并发处理
阅读量:2506 次
发布时间:2019-05-11

本文共 734 字,大约阅读时间需要 2 分钟。


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

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

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

对于每个SQLite的API执行,都需要妥善处理返回值,尤其是SQL_BUSY的时候。

当一个线程独占数据库时,其他线程无论是查询还是写入,都可能返回SQL_BUSY,这个时候,有几种处理方式:

1,使用操作系统的锁,比如信号量和Mutex,把执行写入的操作代码框在临界区内。

HANDLE hMutex =NULL;hMutex = CreateMutex(NULL, TRUE, NULL);WaitForSingleObject(hMutex, INFINITE);sqlite operation;ReleaseMutex(hMutex);

2,让其他线程在遇到SQL_BUSY的时候重试。

Exec:int nRet = sqlite3_exec(db, sql, NULL, NULL, errmsg);if(nRet== SQL_BUSY){    sleep(100);    goto Exec;}

注意个人设置重试次数,以免死锁。

3,经测试,在显式地开启了事务后,其他线程似乎会默认等待,到事务执行完成后再进入临界区。相当于sqlite引擎做了第1种方案做的事。

转载地址:http://knlgb.baihongyu.com/

你可能感兴趣的文章
20145226 《Java程序设计》第5周学习总结
查看>>
Strange Queries (莫队+容斥原理)
查看>>
图的算法专题——最短路径
查看>>
【VBA编程】02.调试VBA程序
查看>>
2.HTML5 标准改变,准备工作
查看>>
vue cli的安装与使用
查看>>
大杂烩 -- Java内存布局【图】以及java各种存储区【详解】
查看>>
ubuntu 安装 navicat
查看>>
12 电视机
查看>>
加解密算法
查看>>
【Python】Camera拍照休眠唤醒测试
查看>>
B. Yet Another Crosses Problem
查看>>
PATA1048题解
查看>>
dlmalloc(Android bionic C库的malloc实现)简介
查看>>
P2814 家谱
查看>>
Linux安装jdk,编写helloworld程序
查看>>
课后作业二
查看>>
学习心得5月
查看>>
Ansible入门篇:playbook的使用
查看>>
分享7天速成一款RTS游戏的经验
查看>>