SQLite的事务处理方式

SQLite把每一条SQL语句解释为一个事务,这就是事务处理自动提交模式;也可以通过begin...commit语句实现对多条SQL语句的包裹,也就是多条SQL语句在一个事务中进行处理,这就是用户提交模式

写事务擦写flash事务处理流程:

1.申请共享锁(shared lock)

在写数据库之前,必须先读取数据库的格式以及所要修改的数据页。

每个sqlite数据库都有一个只读表sqlite_master,他定义数据库的模式

1 create table sqlite_master(
2 type TEXT,
3 name TEXT,
4 tbl_name TEXT,
5 rootpage INTEGER,
6 sql TEXT
7 );

type字段:‘table’,‘index’,‘view’,‘trigger’;'table'可以是普通表和虚拟表(virtual)

name字段:表、索引、视图、触发器名称

tbl_name字段:对于表和视图,tbl_name=name;对于索引,tbl_name是该索引所属的表的名称;对于触发器,tbl_name存储引起触发器动作的表或视图名称

rootpage字段:对于表和索引,存储root b-tree的页数;对于视图、触发器和虚拟表,rootpage=0 || NULL

sql字段:‘CREATE TABLE’,‘CREATE VIEW’,‘CREATE INDEX’,‘CREATE VIRTUAL TABLE’,‘CREATE TRIGGER’

2.从数据库读取信息

数据页首先从flash读到系统缓存,然后从系统缓存传递到用户空间,用户空间与系统缓存都位于RAM中。

3.申请一个预留锁(reserved lock)

在修改数据库文件之前,写事务必须获得其预留锁,意味着写事务将来会写数据库,现阶段只读取数据库,reserved lock和shared lock可以同时存在,但是只能有一个reserved lock和多个shared lock。

4.生成回滚日志文件

申请预留锁成功之后,会在系统缓存中生成回滚日志文件,并要把要修改页的原始数据写入回滚日志。

5.修改用户空间的数据页

6.刷回滚日志文件到flash

回滚日志刷新是二次刷新,首先将回滚日志内容(原始数据)刷新至flash;然后将页总数写入回滚日志文件头,将文件头刷新至flash

7.获得一个独享锁(exclusive lock)

任何需要写数据库文件的事务必须获得独享锁,任意时刻只有一个事务可以获得独享锁

8.将修改数据写入到数据库文件中

将用户空间的数据写入操作系统缓存

9.刷新修改页到flash

10.删除回滚日志文件

11.释放exclusive lock

原文地址:https://www.cnblogs.com/binger1990/p/2715676.html