SQLite 与线程html
SQLite 是线程安全的。ios
线程模型git
SQLite 支持以下三种线程模型github
设置线程模型sql
SQLite 能够经过如下三种方式进行线程模型的设置,在实际应用中选择任一一项均可以。数据库
SQLite 并发和事务缓存
事务安全
事务是 SQLite 的核心概念。对数据库的操做 (绝大部分) 会被打包成一个事务进行提交,须要注意的是,这里的打包成事务是自动开启的。举例而言,若是简单在一个 for 循环语句里向数据库中插入 10 条数据,意味着将自动生成 10 个事务。但须要注意的是事务是很是耗时的,通常而言, SQLite 每秒可以轻松支持 50000 条的数据插入,可是每秒仅可以支持几十个事务。通常而言,事务速度受限于磁盘速度。因此在批量插入时须要考虑禁用自动提交,将其用 BEGIN ... COMMIT 打包成一个事务。多线程
回滚模式和 WAL并发
为了保证写入正确,SQLite 在使用事务进行数据库改写时将拷贝当前数据库文件的备份,即 rollback journal,当事务失败或者发生意外须要回滚时则将备份文件内容还原到数据库中,并同时删除该日志。这是默认的 DELETE 模式。
然后 SQLite 也引入了 WAL 模式,即 Write-Ahead Log。在这种模式下,全部的修改会写入一个单独的 WAL 文件内。这种模式下,写操做甚至能够不去操做数据库,这使得全部的读操做能够在 "写的同时" 直接对数据库文件进行操做,获得更好的并发性能。
锁和并发
SQLite 经过五种锁状态来完成事务。
一个线程只有拥有低级别锁时才可以得到更高一级的锁
/*
** Lock the file with the lock specified by parameter eFileLock - one
** of the following:
**
** (1) SHARED_LOCK
** (2) RESERVED_LOCK
** (3) PENDING_LOCK
** (4) EXCLUSIVE_LOCK
**
** Sometimes when requesting one lock state, additional lock states
** are inserted in between. The locking might fail on one of the later
** transitions leaving the lock state different from what it started but
** still short of its goal. The following chart shows the allowed
** transitions and the inserted intermediate states:
**
** UNLOCKED -> SHARED
** SHARED -> RESERVED
** SHARED -> (PENDING) -> EXCLUSIVE
** RESERVED -> (PENDING) -> EXCLUSIVE
** PENDING -> EXCLUSIVE
**
** This routine will only increase a lock. Use the sqlite3OsUnlock()
** routine to lower a locking level.
*/
总结
综上所述,要保证数据库使用的安全,通常能够采用以下几种模式
由于写操做的并发性并很差,当多线程进行访问时实际上仍旧须要互相等待,而读操做所须要的 SHARED 锁是能够共享的,因此为了保证最高的并发性,推荐
参考
Using SQLite In Multi-Threaded Applications
https://blog.csdn.net/u011342466/article/details/79740086