1.SQLite 支持如下三种线程模型
- 单线程模型 这种模型下,所有互斥锁都被禁用,同一时间只能由一个线程访问。(SQLITE_THREADSAFE = 0)
- 多线程模型 这种模型下,一个连接在同一时间内只有一个线程使用就是安全的。(SQLITE_THREADSAFE = 2)
- 串行模型 开启所有锁,可以随意访问。 (SQLITE_THREADSAFE=1)
2.可以在编译期设定编译参数值来确定使用哪种模式,也可以在运行时调用函数sqlite3_config(SQLITE_CONFIG_MULTITHREAD)启用。这几个模式的区别在于加锁的范围不同
3.一个SQLite数据库文件有5种锁的状态:
- UNLOCKED:表示数据库此时并未被读写。
- SHARED:表示数据库可以被读取。SHARED锁可以同时被多个线程拥有。一旦某个线程持有SHARED锁,就没有任何线程可以进行写操作。
- RESERVED:表示准备写入数据库。RESERVED锁最多只能被一个线程拥有,此后它可以进入PENDING状态。
- PENDING:表示即将写入数据库,正在等待其他读线程释放SHARED锁。一旦某个线程持有PENDING锁,其他线程就不能获取SHARED锁。这样一来,只要等所有读线程完成,释放SHARED锁后,它就可以进入EXCLUSIVE状态了。
- EXCLUSIVE:表示它可以写入数据库了。进入这个状态后,其他任何线程都不能访问数据库文件。因此为了并发性,它的持有时间越短越好。
一个线程只有在拥有低级别的锁的时候,才能获取更高一级的锁。
参考链接:
https://blog.csdn.net/qq_30389757/article/details/65481805
https://www.cnblogs.com/feng9exe/p/10682567.html