SQLite3 - 文件锁和同步机制

SQLite3 提供了一个新的锁和同步机制来提高并发,减少死锁。
SQLite3的锁和同步有Pager Module(pager.c)负责处理。Pager Modue负责SQLite事务的ACID, 也提供缓存功能。Pager Modue不需要知道BTree, 字符编码, 索引的结构,  Pager Module用来管理Page, 一个Page对应一个DiskBlock, 大小一般是1024Byte。


1. SQLite3 数据库的锁状态
UNLOCKED
SHARED
RESERVED 保留锁, 表示数据库将被写,  一个数据库只能有一个保留锁, 保留锁可以和共享锁共存, 与PENDING锁的不同之处在于还能获得新的共享锁,PENDING锁被激活时, 不能再获得共享锁。
PENDING
EXCLUSIVE


2.  回滚日志文件
如果有更新数据库操作, SQLite就会生成回滚日志文件, 以"-journal"的文件名结尾, 与数据库文件存放在同一目录下。 如果多个数据库同时工作, 每个数据库都有自己的回滚日志文件, 并且还有一个master journal日志文件。master journal没有数据, 只包含各个回滚日志文件名。每个数据库的回滚日志文件也会包含master journal文件名。
当访问数据库时发现有"hot journal"时, SQLite就会进行回滚工作, 回滚结束就删除回滚日志文件。

处理"hot journal"
(1) 尝试获得SHARED LOCK, 如果失败, 立即结束, 返回SQLITE_BUSY
(2) 检查是否有"hot journal", 如果没有立即返回, 否则继续执行以下步骤
(3) 尝试获得PENDING LOCK, 然后EXCLUSIVE LOCK, 如果失败, 表示其他进程正在做回滚, 释放所有锁, 关闭数据库, 返回SQLITE_BUSY。 否则继续执行
(4) 读回滚日志文件, 回滚数据库文件
(5) 删除回滚日志文件
(6) 删除master journal 文件
(7) 释放PENDING LOCK和EXCLUSIVE LOCK, 但是保留SHARED LOCK

3. 写数据库文件步骤
(1) 获得共享锁
(2) 获得RESERVED LOCK, 如果失败, 返回SQLITE_BUSY, 否则继续执行
(3) 生成回滚日志文件, 写入磁盘, 等待写完成继续执行

如果是单个数据库文件
(4) 请求获得PENDING LOCK
(5) 请求获得EXCLUSIVE LOCK
(6) flush/fsync, 将更新写入磁盘
(7) 删除回滚日志文件
(8) 释放EXCLUSIVE LOCK, PENDING LOCK, RESERVED LOCK, 获得SHARED LOCK


如果是多个数据库文件事务
(4) 请求获得PENDING LOCK 和EXCLUSIVE LOCK, 确保所有数据库都获得EXCLUSIVE LOCK
(5) 生成master journal文件和每个数据库的回滚日志文件
(6) flush/fsync, 将更新写入磁盘
(7) 先删除master journal 文件, 再删除所有的回滚日志文件
(8) 释放所有数据库上的EXCLUSIVE LOCK, 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会负责将更新写到磁盘。

参考
http://www.sqlite.org/lockingv3.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值