sqlite 線程模型

官網:https://www.sqlite.org/c3ref/open.htmlhtml

轉載:https://blog.csdn.net/yifanernei/article/details/5642127sql

SQLite 支持三種線程模式:
1. 單線程模式
    這種模式下,沒有進行互斥,多線程使用不安全
2. 多線程模式
    這種模式下,在多線程中使用單個數據庫鏈接是不安全的,不然就是安全的。(譯註:即不能在多個線程中共享數據庫鏈接)
3. 串行模式
    這種模式下,sqlite是線程安全的。(譯註:即便在多個線程中不加互斥的使用同一個數據庫鏈接)數據庫

 線程模式能夠在編譯時(經過源碼編譯sqlite庫時)、啓動時(使用sqlite的應用程序初始化時)或者運行時(建立數據庫鏈接時)來指定。通常而言,運行時指定的模式將覆蓋啓動時的指定模式,啓動時指定的模式將覆蓋編譯時指定的模式。可是,單線程模式一旦被指定,將沒法被覆蓋。
    默認的線程模式是串行模式。安全

 

編譯時選擇線程模式
    能夠經過定義SQLITE_THREADSAFE宏來指定線程模式。若是沒有指定,默認爲串行模式。定義宏SQLITE_THREADSAFE=1指定使用串行模式;=0使用單線程模式;=2使用多線程模式。
    sqlite3_threadsafe()函數的返回值能夠肯定編譯時指定的線程模式。若是指定了單線程模式,函數返回false。若是指定了串行或者多線程模式,函數返回true。因爲sqlite3_threadsafe()函數要早於多線程模式以及啓動時和運行時的模式選擇,因此它既不能區別多線程模式和串行模式也不能區別啓動時和運行時的模式。多線程

譯註:最後一句可經過sqlite3_threadsafe函數的實現來理解
函數

SQLITE_API int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; }

 

   若是編譯時指定了單線程模式,那麼臨界互斥邏輯在構造時就被省略,所以也就沒法在啓動時或運行時指定串行模式或多線程模式。spa

 

啓動時選擇線程模式
    假如在編譯時沒有指定單線程模式,就能夠在應用程序初始化時使用sqlite3_config()函數修改線程模式。參數SQLITE_CONFIG_SINGLETHREAD可指定爲單線程模式,SQLITE_CONFIG_MULTITHREAD指定爲多線程模式,SQLITE_CONFIG_SERIALIZED指定爲串行模式。.net

運行時選擇線程模式
    若是沒有在編譯時和啓動時指定爲單線程模式,那麼每一個數據庫鏈接在建立時可單獨的被指定爲多線程模式或者串行模式,可是不能指定爲單線程模式。若是在編譯時或啓動時指定爲單線程模式,就沒法在建立鏈接時指定多線程或者串行模式。
    建立鏈接時用sqlite3_open_v2()函數的第三個參數來指定線程模式。SQLITE_OPEN_NOMUTEX標識建立多線程模式的鏈接;SQLITE_OPEN_FULLMUTEX標識建立串行模式的鏈接。若是沒有指定標識,或者使用sqlite3_open()或sqlite3_open16()函數來建立數據庫鏈接,那麼在編譯時或啓動時指定的線程模式將做爲默認的線程模式使用。線程

只有開啓了多線程模型,才能在多線程中發生數據庫競爭使用sqlite3_busy_handler() 函數來進行重試code

相關文章
相關標籤/搜索