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