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

相关文章
相关标签/搜索