| 模式 | 說明 | 適用場景 | 啟用方式 |
|---|---|---|---|
| 單線程 | 無互斥鎖,完全不安全。效能最高但不可並發。 | 嵌入式單線程應用、唯讀資料庫 | 編譯 SQLITE_THREADSAFE=0 或 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD) |
| 多線程 | 僅核心鎖,連線與 Statement 無鎖。同一連線不可跨線程共用。 | 連線池模式,每線程獨立連線 | 編譯 SQLITE_THREADSAFE=2 或 sqlite3_config(SQLITE_CONFIG_MULTITHREAD) 或開啟時 SQLITE_OPEN_NOMUTEX |
| 串行化 | 全鎖(核心+連線+Statement),完全線程安全,但並發退化為串行。 | 簡單應用、低並發、需共用連線 | 預設模式(SQLITE_THREADSAFE=1)或 sqlite3_config(SQLITE_CONFIG_SERIALIZED) 或 SQLITE_OPEN_FULLMUTEX |
運行時指定 > 啟動時指定 > 編譯時指定。單線程模式一旦確定不可覆蓋。
// 編譯 SQLite 時定義宏
-DSQLITE_THREADSAFE=1 // 串行化 (預設)
-DSQLITE_THREADSAFE=0 // 單線程
-DSQLITE_THREADSAFE=2 // 多線程
可用 sqlite3_threadsafe() 查詢編譯時設定:返回 0 表單線程,1 表多線程/串行化(無法區分)。
// 在 sqlite3_initialize() 前呼叫(通常在應用啟動早期)
sqlite3_config(SQLITE_CONFIG_SINGLETHREAD); // 單線程
sqlite3_config(SQLITE_CONFIG_MULTITHREAD); // 多線程
sqlite3_config(SQLITE_CONFIG_SERIALIZED); // 串行化
// 使用 sqlite3_open_v2() 第三個參數
sqlite3_open_v2("db.sqlite", &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_NOMUTEX, NULL); // 多線程模式連線
sqlite3_open_v2("db.sqlite", &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX, NULL); // 串行化模式連線
若不指定旗標,則沿用編譯/啟動時的預設模式。
PRAGMA journal_mode=WAL)搭配多線程模式,每線程持有獨立連線,讀寫不阻塞。SQLITE_OPEN_FULLMUTEX。// 編譯時
int compileMode = sqlite3_threadsafe(); // 0=單線程, 1=其他
// 運行時無直接 API 查詢,建議應用層記錄開啟時的旗標
sqlite3* 連線 → 會崩潰或資料損壞。