sqlite多线程访问

1.SQLite 支持如下三种线程模型

  • 单线程模型 这种模型下,所有互斥锁都被禁用,同一时间只能由一个线程访问。(SQLITE_THREADSAFE = 0)
  • 多线程模型 这种模型下,一个连接在同一时间内只有一个线程使用就是安全的。(SQLITE_THREADSAFE = 2)
  • 串行模型 开启所有锁,可以随意访问。 (SQLITE_THREADSAFE=1)

 

2.可以在编译期设定编译参数值来确定使用哪种模式,也可以在运行时调用函数sqlite3_config(SQLITE_CONFIG_MULTITHREAD)启用。这几个模式的区别在于加锁的范围不同

 

3.一个SQLite数据库文件有5种锁的状态:

  • UNLOCKED:表示数据库此时并未被读写。
  • SHARED:表示数据库可以被读取。SHARED锁可以同时被多个线程拥有。一旦某个线程持有SHARED锁,就没有任何线程可以进行写操作。
  • RESERVED:表示准备写入数据库。RESERVED锁最多只能被一个线程拥有,此后它可以进入PENDING状态。
  • PENDING:表示即将写入数据库,正在等待其他读线程释放SHARED锁。一旦某个线程持有PENDING锁,其他线程就不能获取SHARED锁。这样一来,只要等所有读线程完成,释放SHARED锁后,它就可以进入EXCLUSIVE状态了。
  • EXCLUSIVE:表示它可以写入数据库了。进入这个状态后,其他任何线程都不能访问数据库文件。因此为了并发性,它的持有时间越短越好。

一个线程只有在拥有低级别的锁的时候,才能获取更高一级的锁。

 

参考链接:

https://blog.csdn.net/qq_30389757/article/details/65481805

https://www.cnblogs.com/feng9exe/p/10682567.html

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Qt中,使用SQLite多线程可以通过以下步骤实现: 1. 创建SQLite数据库连接:在主线程中创建一个Qt数据库连接对象,并通过`QSqlDatabase::addDatabase("QSQLITE")`方法设置数据库驱动类型为SQLite。然后,使用`QSqlDatabase::setDatabaseName()`方法设置数据库文件的路径。 2. 在每个需要访问数据库的线程中,创建独立的数据库连接:对于每个使用SQLite数据库的线程,需要在该线程中创建独立的数据库连接。可以通过调用`QSqlDatabase::cloneDatabase()`方法来创建一个与主线程数据库连接相同的副本连接。 3. 在每个线程中执行数据库操作:在每个独立的线程中,使用`QSqlDatabase`对象连接到数据库,并执行相应的数据库操作,如查询、插入、更新或删除。可以使用`QSqlQuery`对象来执行SQL语句。 4. 线程间数据共享:如果多个线程需要共享数据,可以使用Qt提供的线程间通信机制,如信号槽或自定义的全局变量,在不同的线程之间传递数据。 需要注意的是,SQLite数据库的多线程访问是线程安全的,可以在多个线程中同时访问同一个数据库。但是,需要注意避免数据库操作的竞争条件,如同时对同一表执行插入和更新操作可能导致数据不一致。 另外,Qt还提供了`QtConcurrent`模块,可以进一步简化多线程编程。该模块提供了一些方便的函数,如`QFuture`和`QFutureWatcher`,可以实现并行执行数据库操作,并在操作完成后通知主线程更新UI等操作。 综上所述,通过上述步骤和Qt提供的多线程编程机制,可以在Qt中实现SQLite数据库的多线程访问。注意在并发访问数据库时要处理好线程安全问题,以确保数据的一致性和正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值