设为首页 加入收藏

TOP

SQLite学习笔记(九):pager模块(二)
2015-11-21 01:26:34 来源: 作者: 【 】 浏览:1
Tags:SQLite 学习 笔记 :pager 模块
获取EXECLUSIVE lock,如果此时还有读事务,则报SQLITE_BUSY错误
?
(4).将dirty-page写入日志文件,并将这些cache标记为clean,表示可以重用如果是因为cache满了,导致需要写datafile操作,由于用户没有发起事务提交,因此pager模块也不会提交事务。
?
pager模块重复上述的1,2,3,4点,直到事务提交。为了避免事务提交前,其他事务读到脏数据,因此在进行刷脏页时,需要在文件上EXECLUSIVE lock,那么直到事务提交前,这个EXECLUSIVE lock都不会释放,导致这种情况下,所有其它读、写事务都被堵塞。因此,大事务会降低整体的并发性能。
?
锁管理器
?
sqlite的并发控制靠封锁实现,依据两阶段锁协议,保证事务的ACID。Sqlite的并发控制依赖于文件锁,通过锁文件的特定的区域,实现互斥。Sqlite主要包含4种锁,SHARED_LOCK(共享锁),(RESERVED_LOCK)保留锁,(PENDING_LOCK)未决锁和(EXCLUSIVE_LOCK)排它锁,其中共享锁与排它锁在文件的同一片区域。RESERVED_LOCK主要用于写写互斥,PENDING_LOCK则主要用于读写互斥,并有延缓互斥的作用。关于锁并发详细可以看sqlite封锁机制。
关键接口
?
sqlite3PagerCommitPhaseOne ? ?//提交事务第一阶段:文件修改计数器增1,将日志文件刷入磁盘,将事务修改的脏页刷入磁盘。
sqlite3PagerCommitPhaseTwo ? ?//提交事务的第二阶段:删除日志文件,释放锁
sqlite3PagerRollback ? ? ?//回滚事务:回滚事务在数据文件的修改,将排它锁降级为共享锁,所有缓存页面还原到修改之前的状态,删除日志文件。
pcache1ResizeHash【扩展hash】 ? //最大缓存2000个page,LRU链表,插入队头,从队尾删除
setSharedCacheTableLock ? ?//table-lock接口
pagerLockDb ? ?//文件锁接口?
walLockShared wal ? ?//文件共享读锁接口
walLockExclusive wal ? ?//文件排它锁接口
sqlite3PagerAcquire ? ?//获取某一页
readDbPage ? ?//读取page
pcache1FetchNoMutex ? //查找cache
pcache1FetchStage2 ? //添加cache
pcache1RemoveFromHash ?//移除cache
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇维度模型数据仓库基础对象概念一览 下一篇ETL工具Pentaho Kettle的transfor..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: