SQLite的并发处理
来源:互联网 发布:淘宝客需要什么软件 编辑:程序博客网 时间:2024/06/05 02:36
使用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种方案做的事。
0 0
- SQLite的并发处理
- sqlite并发写处理
- mysql与sqlite在处理并发问题时的不同
- Android sqlite数据库并发访问问题处理
- sqlite多进程并发读写模式下,返回SQLITE_BUSY错误的处理方法
- Android 中SQLite进行读写时,涉及的并发处理问题
- sqlite单引号的处理
- FastCGI的并发处理
- FastCGI的并发处理
- AtomicInteger的并发处理
- AtomicInteger的并发处理
- 并发处理的心得
- AtomicInteger的并发处理
- 数据的并发处理
- Golang的并发处理
- AtomicInteger的并发处理
- 高并发的处理
- skynet的并发处理
- android的spinner字体控制
- java des加密与解密
- 走进cassandra之二:数据模型
- 1077. Kuchiguse (20)
- setitimer设置定时器测试---1
- SQLite的并发处理
- html页面调试设置不让浏览器缓存
- 评论:翻拍《葫芦娃》是文化“啃老”
- window下mysql主从复制设置
- Ubuntu打开终端的方法三种
- oracle存储过程实例
- C++ FAQ
- SQL SERVER – Introduction to SQL Server Encryption and Symmetric Key Encryption Tutorial with Script
- 获取GRIDVIEW中的TemplateField显示的文本值