- 博客(6)
- 资源 (4)
- 收藏
- 关注
原创 SQLite3源码学习(18) 互斥锁
互斥锁是为了保证在多线程时一些不可重入函数执行的串行化,有些函数如malloc等会操作一些共享数据,如果被重入了就会导致共享资源被破坏,从而出现逻辑错误,所以如果有多个线程对共享资源的访问就要加互斥锁。互斥锁部分的代码还是比较简单的,代码实现在mutex.c、mutex_w32.c、mutex_unix.c和mutex_noop.c这几个文件里,另外还有一个test_mutex.c文件做mutex...
2018-04-30 23:08:54 1643
原创 SQLite3源码学习(25) Pager模块之事务锁的实现2
在上一篇文章中介绍了SQLite怎么用Linux中的记录锁来实现每一种类型的事务锁。但这只适合多进程间的互斥,不适合多线程,在Linux中每一个进程只能拥有一把锁,也就是说一个进程里的多个线程共用一把锁,这时会出现一个线程拥有共享锁,另一个线程再获取独占锁时并不会出现排斥,仅仅是把当前进程的锁改为独占锁,还有当一个线程占有锁的时候可能被另一个线程释放等等,这就破坏了数据库中多事务的隔离性。所以SQ...
2018-04-28 14:39:19 378
原创 SQLite3源码学习(24) Pager模块之事务锁的实现1
如果对SQLite事务的概念完全陌生,建议先阅读以下这篇文章来熟悉相关基础概念。SQLite的原子提交原理https://blog.csdn.net/javensun/article/details/8515690 SQLite支持多路并发的事务处理,这就需要一种机制来隔离一个事务相对于其他事务的影响。为了保证事务的隔离性,那么在并发的环境下,对于写数据库的操作就要串行化。而事务锁就是用来解...
2018-04-26 21:55:02 527
原创 SQLite3源码学习(23) 链表的归并排序
一般数组排序采用快速排序最佳,但是在链表中2个元素的交换不是很方便,所以采用归并排序比较好,先把链表分割成一些已经排好序的子链表,最后再串起来就好了。在SQLite中对于脏页链表按照页号重新排序采用的就是归并排序。1.基本思路 子链表存放在一个临时数组里,这个数组定义为PgHdr *a[N_SORT_BUCKET]子链表是按照2的幂次方的大小依次存放,也就是说a[0]存放1个元素,a[1...
2018-04-08 23:48:36 363
原创 SQLite3源码学习(22) Page Cache分析
上一篇学习了pcache1的机制,这是pagecache管理的一个插件,在这基础上又封装了一层,主要是用来处理脏页(就是修改过的缓存页),如脏页的添加删除和回收利用等,这部分代码的实现在pcache.c里。1.数据结构在pcache中,通过PCache结构对象作为连接句柄,每个缓存页通过PgHdr来表示。在pagecache中,所有的脏页通过一个双向链表来连接在一起,其结构关系如下图所示: ...
2018-04-08 22:00:16 832
原创 SQLite3源码学习(21) pcache1分析
学习本章之前要先复习以下2篇文章: SQLite3源码学习(9)Page Cache概述 SQLite3源码学习(10)testpcache分析 之前讲到page cache是一种可插入式的管理方式,在sqlite3GlobalConfig.pcache2里定义了对page cache管理的一系列方法接口,之前我们讲了最简单的一种接口testpcache,现在我们来分析一下默认的接口pach
2018-04-03 11:32:15 1112
sqlite3编译通过的多文件eclipse工程
2017-11-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人