SQLite3数据库中的文件锁和同步机制

SQLite3数据库中的文件锁和同步机制,第1张

概述原文地址:http://www.server110.com/sqlite/201401/4974.html SQLite3 提供了一个新的锁和同步机制来提高并发,减少死锁。 SQLite3的锁和同步有PagerModule(pager.c)负责处理。PagerModue负责SQLite事务的ACID,也提供缓存功能。PagerModue不需要知道BTree,字符编码, 索引的结构,  Pager

原文地址: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)
释放PENDINGLOCKEXCLUSIVELOCK,但是保留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会负责将更新写到磁盘。

总结

以上是内存溢出为你收集整理的SQLite3数据库中的文件锁和同步机制全部内容,希望文章能够帮你解决SQLite3数据库中的文件锁和同步机制所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1172990.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存