2011-04-14 13:29 26939人阅读 评论(2) 收藏 举报

这两天一直在捣鼓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();
   }
}
};

最新文章

  1. linux系统目录结构与层级命令使用
  2. maven 间接依赖的jar自动引入
  3. JAVA_jdk下载和环境变量的配置
  4. python实用小技巧自问自答系列(一):查看类中函数文档doc的方法
  5. PHP内核探索之变量(1)Zval
  6. LOTUS 迁移到Exchange 2010 POC 之在Exchange 2007 安装Lotus Admin!
  7. Badge分析&amp;如何逼死处女座
  8. Linux命令之文件与用户权限
  9. Linux各种包安装及命令
  10. (原)mkl用到的函数
  11. windows下开发PHP扩展(无需Cygwin)
  12. WinFom中经典小游戏(含源码)
  13. UISegmentedControl在Swift中的使用
  14. traefik 结合 docker-compose 的快速安装及使用
  15. LeetCode算法题-Reach a Number(Java实现)
  16. 2018-2019 20165221 网络对抗 Exp5 MSF基础
  17. [R] [Johns Hopkins] R Programming 作業 Week 2 - Air Pollution
  18. 将preg_replace()改写为preg_replace_callback()
  19. Python基础之面向对象进阶一
  20. 【转】asp.net Core 系列【二】—— 使用 ASP.NET Core 和 VS2017 for Windows 创建 Web API

热门文章

  1. vue-router路由详细
  2. shell命令传参数(参数长度不定)
  3. vue框架中实现今天昨天前天最近时间
  4. Solr的学习使用之(十)数据库(Oracle、SqlServer)原有的全文索引功能和Solr对比?
  5. R语言封装函数
  6. 3-基于双TMS320C6678+双XC6VSX315T的6U VPX高速数据处理平台
  7. 关于windows服务器配置
  8. Git命令——提交、查看、后退、前进
  9. spring requestbody json
  10. Intellij IDEA 插件开发秘籍