(2356)SQLite多线程下的并发操作_飞翔的种子_百度空间

摘要:
SQLite多线程下的并发操作_Flying seed_百度空间中SQLite的多线程下并发操作已经在SQLite数据库上运行了两天。基本操作没有提到,但相当简单。如果你有空,你将开始另一个博客来简要总结一下。如果一个朋友想了解与SQLite相关的锁定机制,他可以查看我在博客中转载的SQLite的事务和锁定。解释很透彻,很容易理解。我不会在这里重复。只有具有互斥体的线程才能操作数据库3。写入操作必须独立地具有互斥4。

(2356)SQLite多线程下的并发操作_飞翔的种子_百度空间

SQLite多线程下的并发操作

这两天一直在捣鼓SQLite数据库,基本的操作就不说了,比较简单,打算有空的话另起一篇博文简单总结一下。

这里主要想探讨一下多路并发下的数据库操作

SQLite作为一款小型的嵌入式数据库,本身没有提供复杂的锁定机制,无法内部管理多路并发下的数据操作同步问题,更谈不上优化,所以涉及到多路并发的情况,需要外部进行读写锁控制,否则SQLite会返回SQLITE_BUSY错误,以驳回相关请求。

如果有朋友想了解SQLite相关的锁定机制,可以看看我转载的博文sqlite的事务和锁,讲解的比较透彻,也容易理解,这里就不再重复讲解了。

返回SQLITE_BUSY主要有以下几种情况:

1。当有写操作时,其他读操作会被驳回
2。当有写操作时,其他写操作会被驳回
3。当开启事务时,在提交事务之前,其他写操作会被驳回
4。当开启事务时,在提交事务之前,其他事务请求会被驳回
5。当有读操作时,其他写操作会被驳回
6。读操作之间能够并发执行

基于以上讨论,可以看出这是一个典型的读者写者问题,读操作要能够共享,写操作要互斥,读写之间也要互斥
可以设计如下的方案解决并发操作数据库被锁定的问题,同时保证读操作能够保持最大并发
1。采用互斥锁控制数据库写操作
2。只有拥有互斥锁的线程才能够操作数据库
3。写操作必须独立拥有互斥锁
4。读操作必须能够共享互斥锁,即在第一次读取的时候获取互斥锁,最后一次读取的时候释放互斥锁

具体的代码实现就不贴了,有了思路,实现就很简单了,欢迎大家一起讨论!

下面是我简单编写的一个共享锁,smutex是一个跨平台的锁实现,简单,不多说了:
// 共享锁,第一个进入时锁定,最后一个离开时释放
class shared_mutex
{
private:
static int taked_man_; // 当前持有该锁的线程数
static sp::smutex man_lock_; // taked_man_的修改锁

private:
// 自动模式
bool is_auto_;
sp::smutex *mutex;
public:
void aquire()
{
sp::sguard<sp::smutex> auto_lock(shared_mutex::man_lock_);
if(taked_man_ == 0)
{
mutex->acquire();
}
taked_man_++;
}
void release()
{
sp::sguard<sp::smutex> auto_lock(shared_mutex::man_lock_);
if(this->taked_man_ > 0)
{
taked_man_--;
if(taked_man_ == 0)
{
mutex->release();
}
}
}
public:
shared_mutex(sp::smutex &mt, bool auto_ = true) : mutex(&mt)
{
sp::sguard<sp::smutex> auto_lock(shared_mutex::man_lock_);
this->is_auto_ = auto_;
if(this->is_auto_)
{
this->aquire();
}
}

~shared_mutex()
{
sp::sguard<sp::smutex> auto_lock(shared_mutex::man_lock_);
if(this->is_auto_)
{
this->release();
}
}
};

免责声明:文章转载自《(2356)SQLite多线程下的并发操作_飞翔的种子_百度空间》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇pip离线安装Bottleneck报Error解决EasyReport报表工具下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

RMAN 系列(七) RMAN 维护

这篇资料主要讲到了如下内容: 1. Rman 的维护 2. 恢复目录的维护 3. 备份恢复目录 4. RMAN 存储脚本 5. 删除数据库   一. RMAN 的维护 1.1 交叉效验RMAN 备份 在RMAN目录和物理备份目的地不同步的情况下,我们可以使用crosscheck命令来效验控制文件或恢复目录中的RMAN信息是否与备份介质上的实际物理备...

PostgreSQL(PostGIS)安装和入门的若干问题

更多有关技术经验见小专栏(还有更多开源webgis开发技术):https://xiaozhuanlan.com/topic/7054129683 20190721补充 1. 安装9.x,10.x,11.x均可,建议往高版本走(如果不考虑ArcGIS兼容) 2. 安装时不要选中文 建议选C或者default locale 3. PostGIS导入shp文件的...

thinkphp3.2链接数据库常用的配置选项

thinkphp3.2常用配置选项,app/Common/Conf/config.php 或者 app/Home/Conf/config.php 1 2 3 4 5 6 7 8 'SHOW_PAGE_TRACE'=>true; //开启右下角的调试信息小图标,调试时使用 'DB_TYPE'=>'mysql', //数据库类型...

mysql实战笔记

笔记来源于mysql实战,却高于它 查询语句执行流程 MySQL可以分为Server层和存储引擎层两部分。 Server层:所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。 而存储引擎层负责数据的存储和提取。支持InnoDB、MyISAM、Memory等多个存储引擎。InnoDB从My...

关于MYSQL字符集问题(一)

  MySQL的字符集支持(Character Set Support)有两个方面:     字符集(Character set)和排序方式(Collation)。   对于字符集的支持细化到四个层次:     服务器(server),数据库(database),数据表(table)和连接(connection)。MySQL默认字符集   MySQL对于...

大文件数据库脚本导入解决方案

当客户服务器不允许直接备份时,往往通过导出数据库脚本的方式来部署-还原数据库 但是当数据库导出脚本很大,用Microsoft SQl Server Management Studio执行脚本时,往往会遇到“内存不足”的提示 解决办法: 用微软自带的sqlcmd工具,可以导入执行。以SQL Server 2008R版本为例: 第一步:Win+R键入:cmd命...