Sqlite3多线程读写解决方案 返回

求助
1 475
该叫什么 John 发布于2019/7/5
悬赏:5 飞吻

SQLite 支持三种线程模式:

1. 单线程模式

    这种模式下,没有进行互斥,多线程使用不安全

2. 多线程模式

    这种模式下,在多线程中使用单个数据库连接是不安全的,否则就是安全的。(译注:即不能在多个线程中共享数据库连接)

3. 串行模式

    这种模式下,sqlite是线程安全的。(译注:即使在多个线程中不加互斥的使用同一个数据库连接)


    线程模式可以在编译时(通过源码编译sqlite库时)、启动时(使用sqlite的应用程序初始化时)或者运行时(创建数据库连接时)来指定。一般而言,运行时指定的模式将覆盖启动时的指定模式,启动时指定的模式将覆盖编译时指定的模式。但是,单线程模式一旦被指定,将无法被覆盖。

    默认的线程模式是串行模式。


 


编译时选择线程模式

    可以通过定义SQLITE_THREADSAFE宏来指定线程模式。


定义宏SQLITE_THREADSAFE=1指定使用串行模式;


SQLITE_THREADSAFE=0使用单线程模式;


SQLITE_THREADSAFE=2使用多线程模式。


如果没有指定,默认为串行模式。



    sqlite3_threadsafe()函数的返回值可以确定编译时指定的线程模式。如果指定了单线程模式,函数返回false。如果指定了串行或者多线程模式,函数返回true。由于sqlite3_threadsafe()函数要早于多线程模式以及启动时和运行时的模式选择,所以它既不能区别多线程模式和串行模式也不能区别启动时和运行时的模式。


译注:最后一句可通过sqlite3_threadsafe函数的实现来理解

SQLITE_API int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; }

    如果编译时指定了单线程模式,那么临界互斥逻辑在构造时就被省略,因此也就无法在启动时或运行时指定串行模式或多线程模式。


 


启动时选择线程模式

    假如在编译时没有指定单线程模式,就可以在应用程序初始化时使用sqlite3_config()函数修改线程模式。参数SQLITE_CONFIG_SINGLETHREAD可指定为单线程模式,SQLITE_CONFIG_MULTITHREAD指定为多线程模式,SQLITE_CONFIG_SERIALIZED指定为串行模式。


 


运行时选择线程模式

    如果没有在编译时和启动时指定为单线程模式,那么每个数据库连接在创建时可单独的被指定为多线程模式或者串行模式,但是不能指定为单线程模式。如果在编译时或启动时指定为单线程模式,就无法在创建连接时指定多线程或者串行模式。

    创建连接时用sqlite3_open_v2()函数的第三个参数来指定线程模式。SQLITE_OPEN_NOMUTEX标识创建多线程模式的连接;SQLITE_OPEN_FULLMUTEX标识创建串行模式的连接。如果没有指定标识,或者使用sqlite3_open()或sqlite3_open16()函数来创建数据库连接,那么在编译时或启动时指定的线程模式将作为默认的线程模式使用。



重要的事情说三遍!!!


如果你想在多线程环境下使用数据库,

那么你得确保所有的线程使用的都是同一个数据库连接。


如果你想在多线程环境下使用数据库,

那么你得确保所有的线程使用的都是同一个数据库连接。


如果你想在多线程环境下使用数据库,

那么你得确保所有的线程使用的都是同一个数据库连接。


单个数据库指的是 sqlite3_open一次,然后得到的db供多个线程使用!

--------------------- 

作者:走好每一步 

来源:CSDN 

原文:https://blog.csdn.net/tajon1226/article/details/54864322 

版权声明:本文为博主原创文章,转载请附上博文链接!


热忱回答1

  • John John VIP0
    2019/7/7

    Sqlite 总结一下



    1.当有写操作时,其他读操作会被驳回

    2.当有写操作时,其他写操作会被驳回

    3.当开启事务时,在提交事务之前,其他写操作会被驳回

    4.当开启事务时,在提交事务之前,其他事务请求会被驳回

    5.当有读操作时,其他写操作会被驳回

    6.读操作之间能够并发执行


    0 回复

版块

学习文档

最新会员

发布达人

回贴达人