SQLite 支援三種不同的執行緒模式
單執行緒。在此模式中,所有互斥鎖都已停用,而且 SQLite 不安全,無法一次在多個執行緒中使用。
多執行緒。在此模式中,如果沒有任何單一 資料庫連線 或任何衍生自資料庫連線的物件(例如 已準備好的陳述式)同時在兩個或更多執行緒中使用,則 SQLite 可以安全地由多個執行緒使用。
序列化。在序列化模式中,可以安全地從多個執行緒進行 API 呼叫,以影響或使用任何 SQLite 資料庫連線 或任何衍生自此類資料庫連線的物件。對個別物件的影響與從單一執行緒以相同順序進行所有 API 呼叫的效果相同。「序列化」這個名稱源自於 SQLite 使用互斥鎖將存取序列化至每個物件的事實。
執行緒模式可以在編譯時(當 SQLite 函式庫從原始碼編譯時)、啟動時(當打算使用 SQLite 的應用程式正在初始化時)或執行時(當正在建立新的 SQLite 資料庫連線時)進行選擇。一般來說,執行時會覆寫啟動時,而啟動時會覆寫編譯時。不過,一旦選擇單執行緒模式,就無法覆寫。
預設模式為序列化。
使用 SQLITE_THREADSAFE 編譯時間參數來選擇執行緒模式。如果沒有 SQLITE_THREADSAFE 編譯時間參數,則使用序列化模式。這可以使用 -DSQLITE_THREADSAFE=1 明確表示。使用 -DSQLITE_THREADSAFE=0,執行緒模式為單執行緒。使用 -DSQLITE_THREADSAFE=2,執行緒模式為多執行緒。
sqlite3_threadsafe() 介面的傳回值是編譯時設定的 SQLITE_THREADSAFE 值。它不會反映透過 sqlite3_config() 介面或作為 sqlite3_open_v2() 的第三個引數給定的旗標在執行時期對執行緒模式所做的變更。
如果在編譯時選擇單執行緒模式,則會從建置中省略重要的互斥鎖定邏輯,而且不可能在啟動時或執行時啟用多執行緒或序列化模式。
假設編譯時執行緒模式不是單執行緒,則可以使用 sqlite3_config() 介面在初始化期間變更執行緒模式。 SQLITE_CONFIG_SINGLETHREAD 動詞將 SQLite 設定為單執行緒模式, SQLITE_CONFIG_MULTITHREAD 動詞設定多執行緒模式,而 SQLITE_CONFIG_SERIALIZED 動詞設定序列化模式。
如果在編譯時或啟動時未選擇單執行緒模式,則可以將個別資料庫連線建立為多執行緒或序列化。無法將個別資料庫連線降級為單執行緒模式。如果編譯時或啟動時模式為單執行緒,也無法升級個別資料庫連線。
個別資料庫連線的執行緒模式是由傳遞給 sqlite3_open_v2() 的第三個參數所決定的旗標。 SQLITE_OPEN_NOMUTEX 旗標會讓資料庫連線進入多執行緒模式,而 SQLITE_OPEN_FULLMUTEX 旗標會讓連線進入序列化模式。如果沒有指定任何旗標,或使用 sqlite3_open() 或 sqlite3_open16() 取代 sqlite3_open_v2(),則會使用編譯時期和啟動時期設定所決定的預設模式。
此頁面最後修改於 2023-12-05 14:43:20 UTC