SQLite:一次正常执行事务的过程
来源:互联网 发布:傲战无双坐骑进阶数据 编辑:程序博客网 时间:2024/04/28 19:26
SQLite3中的事务
SQLite3中可以使用BEGIN TRANSACTION
和COMMIT TRANSACTION
来开始和结束一个事务。如果你没有添加这些事务语句,SQLite3会为你的每条SQL语句加上一个事务。
一次正常执行事务的过程
过程分析
- 一次文件创建(回滚日志)
- 两次文件写入
- 两次文件同步(回滚日志,数据库文件)
- 一次文件删除(回滚日志)
- 加了3次锁,最后一次不允许读取
1. 初始状态
数据库打开后,未进行任何数据库操作时大概是下图状态
这里分了三个部分,左面是用户空间,中间是内核缓存区(文件的读写缓存),右边是物理磁盘设备(iOS的闪存)。在SQLite中数据最小的读写单位扇区(sector),通常是512B,图中每个小矩形代表一个扇区。蓝色代表未更改的原始数据,中间白色表示是空的,即此时数据没有读取到内核缓存区。
2. 准备读取(加读锁)
任何写操作都会先进行读操作,因为写之前要读取数据库的schema,插入和修改的位置等。在读取操作之间要加上读锁。加读锁是为了防止其它数据库连接进行写操作,而保证读取时数据不被破坏。这时其它数据库的读取操作依然可以正常执行。
3. 读取数据
加了读锁之后就开始读取数据了
这里读取了3个扇区的数据,读取时通过系统文件读取调用,会从内核缓存中拷贝到用户空间。
4. 准备修改数据(加写锁)
数据读取完毕后,就准备开始修改数据了,修改数据之前首先要加写锁,此写锁可以和其它进程的读锁同时存在:
5. 建立回滚日志
开始写操作之前,先建立一个回滚日志文件,已便进行回滚操作。将更改之前的旧数据保存到回滚日志文件中。
回滚日志文件包含一个头信息(绿色部分),记录回滚必要信息。
6. 在用户空间中修改数据
图中粉色表示已修改的数据
7. 同步(fsync)回滚日志文件
用户空间修改数据后,未确保回滚日志文件可靠,必须把回滚日志文件同步到物理磁盘进行持久存储。这样以确保内核崩溃或断电后依然可恢复数据。
8. 加互斥锁
准备开始真正的写文件了,要加互斥锁了。互斥锁可以和已经打开的读锁同时存在,但不允许新建读锁了。
9. 写数据库文件
10. 同步(fsync)数据库文件
同步数据库文件到持久性存储设备
11. 删除回滚日志
同步数据库文件后才能删除回滚日志,确保内核崩溃或断点后依然可恢复数据
12. 释放锁
图片来源
sqlite.org
- SQLite:一次正常执行事务的过程
- 一次shutdown操作无法正常执行的处理过程
- oracle事务的执行过程
- 一次完整的HTTP事务过程分析
- 一次事务过程
- grpc的invoke(一次请求)正常执行流程
- hibernate的一次简单执行过程
- 一次service不能正常启动的处理过程
- 记一次系统不能正常加载的修复过程
- 记一次Redhat7无法正常开机的解决过程
- fragmentTransaction 事务只能执行一次
- 一次完整的HTTP事务是怎样的一个过程?
- 第二篇 一次事务过程
- 一次完整的HTTP事务是怎样一个过程?
- 一次完整的HTTP事务是怎样一个过程
- 一次完整的HTTP事务是怎样一个过程
- 一次完整的HTTP事务是怎样一个过程?
- 一次完整的HTTP事务是怎样一个过程?
- Java内存模型分析(堆、栈和常量池以及相关String的详细讲解)
- 92
- Servicehot告诉你运维常说的 5个9、4个9、3个9啥意思?
- 第二章 算法基础
- jQuery选择器和选取方法
- SQLite:一次正常执行事务的过程
- [WPF] UserControl vs CustomControl
- oracle建表空间 各种语句
- 《UNIX环境高级编程》笔记9--文件访问权限和新文件、目录所有权
- MAC 安装MySQL my.cnf配置文件
- JMeter官方文档:3. 测试计划中的元素
- ES6里面的解构赋值最佳使用位置
- ubuntu下JPEG的交叉编译
- 页面初始化获取div高和宽、窗口变化事件