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