• 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

  • 相关阅读:
    反射获取class的Class
    线程礼让yield和线程的强制执行join
    Lambda表达式
    java中的静态代理
    java多线程中的callable接口实现
    java利用线程并行的方法模拟龟兔赛跑
    java中的多线程
    HTTP 协议之请求格式
    java的反射概述
    Tomcat和servlet的关系
  • 原文地址:https://www.cnblogs.com/binger1990/p/2715676.html
Copyright © 2020-2023  润新知