zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    centos 编码问题 编码转换 cd到对应目录 执行 中文解压
    centos 编码问题 编码转换 cd到对应目录 执行 中文解压
    centos 编码问题 编码转换 cd到对应目录 执行 中文解压
    Android MVP 十分钟入门!
    Android MVP 十分钟入门!
    Android MVP 十分钟入门!
    Android MVP 十分钟入门!
    mysql备份及恢复
    mysql备份及恢复
    mysql备份及恢复
  • 原文地址:https://www.cnblogs.com/binger1990/p/2715676.html
Copyright © 2011-2022 走看看