原文地址:http://www.server110.com/sqlite/201401/4974.html
SQLite3 提供了一个新的锁和同步机制来提高并发,减少死锁。 SQLite3的锁和同步有PagerModule(pager.c)负责处理。PagerModue负责SQLite事务的ACID,也提供缓存功能。PagerModue不需要知道BTree,字符编码,索引的结构,Pager Module用来管理Page,一个Page对应一个DiskBlock,大小一般是1024Byte。
1. SQLite3 数据库的锁状态 UNLOCKED SHARED RESERVED 保留锁,表示数据库将被写, 一个数据库只能有一个保留锁, 保留锁可以和共享锁共存,与PENDING锁的不同之处在于还能获得新的共享锁,PENDING锁被激活时,不能再获得共享锁。 PENDING EXCLUSIVE
2. 回滚日志文件 如果有更新数据库操作,SQLite就会生成回滚日志文件,以"-journal"的文件名结尾,与数据库文件存放在同一目录下。如果多个数据库同时工作,每个数据库都有自己的回滚日志文件,并且还有一个master journal日志文件。master journal没有数据,只包含各个回滚日志文件名。每个数据库的回滚日志文件也会包含masterjournal文件名。 当访问数据库时发现有"hot journal"时,SQLite就会进行回滚工作,回滚结束就删除回滚日志文件。
处理"hot journal" (1) 尝试获得SHAREDLOCK,如果失败, 立即结束,返回SQLITE_BUSY (2) 检查是否有"hotjournal",如果没有立即返回, 否则继续执行以下步骤 (3) 尝试获得PENDINGLOCK,然后EXCLUSIVELOCK, 表示其他进程正在做回滚, 释放所有锁,关闭数据库,返回SQLITE_BUSY。否则继续执行 (4) 读回滚日志文件,回滚数据库文件 (5) 删除回滚日志文件 (6) 删除masterjournal 文件 (7) 释放PENDINGLOCK和EXCLUSIVELOCK,但是保留SHAREDLOCK
3. 写数据库文件步骤 (1) 获得共享锁 (2) 获得RESERVEDLOCK, 返回SQLITE_BUSY, 否则继续执行 (3) 生成回滚日志文件,写入磁盘, 等待写完成继续执行
如果是单个数据库文件 (4) 请求获得PENDINGLOCK (5) 请求获得EXCLUSIVELOCK (6) flush/fsync,将更新写入磁盘 (7) 删除回滚日志文件 (8) 释放EXCLUSIVELOCK,PENDING LOCK,RESERVED LOCK,获得SHARED LOCK
如果是多个数据库文件事务 (4) 请求获得PENDINGLOCK 和EXCLUSIVELOCK,确保所有数据库都获得EXCLUSIVELOCK (5) 生成masterjournal文件和每个数据库的回滚日志文件 (6) flush/fsync,将更新写入磁盘 (7) 先删除masterjournal 文件, 再删除所有的回滚日志文件 (8) 释放所有数据库上的EXCLUSIVELOCK,PENDING LOCK
4. SQL事务 默认SQLite autocommit=true BEGIN TRANSACTION - COMMIT 命令使得SQLite不在autocommit下工作。当SQLite执行BEGIN命令时,不会获得任何锁, 直到执行到第一个SELECT, 才获得一个SHARED LOCK, 执行到UPDATE/INSERT/DELETE才获得REVERSED LOCK,当缓存满或者COMMIT时才请求获得EXCLUSIVE LOCK。
COMMIT并非真正的将更新写到磁盘,COMMIT使得SQLITE回到autocommit=true 模式,autocommit会负责将更新写到磁盘。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|