sqlite并发写处理

来源:互联网 发布:网络主播用英语怎么说 编辑:程序博客网 时间:2024/06/06 05:22

在模拟面试的时候被问到了sqlite写入并发的处理,因为之前完全没有并发的问题,曾经在一个资料上说sqlite本身有自己的锁可以防止并发问题,所以我回答的就是我程序中没有遇到写入失败的问题,sqlite本身会处理并发的问题,具体怎么处理的我不太清楚,他们问我如果遇到这个问题怎么解决我也没回答上来。

这两天一直在纠结这个问题,一直也没时间查找这个问题的答案,今天上午自己测试了一下确实同时写入数据库的时候会出现写入失败的问题,sqlite3_exec执行写的时候会自己加一个排他锁,所以两个写入操作同时进行会出现一个写入失败的问题。在网上查找解决方法的时候都说sqlite在读取操作的时候支持多个读,一旦有了写入的操作只能同一时间一次写入,原因就是sqlite是文件型的数据库,这样我们写入数据库的时候就可以采用两种方法解决并发问题:

在多线程编程中:

1、  采用循环解决:如果写入操作不是特别频繁的时候即两次写入时间间隔较长的时候可以在sqlit3_exec外加一死循环,执行sqlite3_exce的时候判断执行是否成功,如果成功则退出循环,如果失败继续执行循环。这样可以保证每个写入操作都能执行,bug就是如果每个线程的写入操作间隔时间较短的时候就会出现有线程死在那里的现象。

2、  采用互斥锁解决:在程序初始化的时候初始化一个互斥锁,每次执行sqlite_exec的时候加锁,执行完之后解锁,这样可以保证每个线程都能执行写入操作,获取锁的时候会有阻塞等待的情况,每次sqlite3_exec执行的速度很快,等待时间可以忽略不计。

在多进程编程中:

1、  采用循环解决:如果写入操作不是特别频繁的时候即两次写入时间间隔较长的时候可以在sqlit3_exec外加一死循环,执行sqlite3_exce的时候判断执行是否成功,如果成功则退出循环,如果失败继续执行循环。这样可以保证每个写入操作都能执行,bug就是如果每个线程的写入操作间隔时间较短的时候就会出现有线程死在那里的现象。

2、  采用文件锁解决:数据库本身是文件型的,但是我们不能通过fcntl给数据库加锁,所以我们新建一个普通的文件作为数据库的文件锁的替代文件。在每次写入的时候加锁,写入之后解锁,因为文件锁平台移植性更强。也可以采用共享内存的方法解决,获取线程互斥锁也可以,但是要设置互斥锁的属性。

 

 

原创粉丝点击