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/archive/2012/10/08/2715676.html

SQLite的事务处理方式相关推荐

  1. Linq to Sql : 三种事务处理方式

    Linq to SQL支持三种事务处理模型:显式本地事务.显式可分发事务.隐式事务.(from  MSDN: 事务 (LINQ to SQL)).MSDN中描述得相对比较粗狂,下面就结合实例来对此进行 ...

  2. 在C#中实现SQLite的事务处理

    一.SQLite事务介绍 事务是针对一个或多个数据库中数据操作的基本单位,操作时可以把许多个SQLite语句组合为一组,把所有这些放在一起作为事务的一部分进行执行. 所有 SQL 命令组成一个单元. ...

  3. SQLite的事务处理

    原文转载:SQLite事务(Transcation)/BUNOOB.COM 概述:SQLite事务(Transaction) 事务是一个对数据库执行工作单元,是以逻辑顺序完成的工作单位或序列,可以由用 ...

  4. SQLite 基本命令使用方式

    本文介绍创建一个简单的数据库,并能够在需要的时间和地点快速使用它们.SQLite 在世界范围内的许多设备中使用. 什么是SQLite? SQLite是一个进程内的库,实现了自给自足的.无服务器的.零配 ...

  5. Spring有几种事务处理方式?举例说明

    1.用原始的transactionfactorybean的,代理dao事务处理 2.用aop:config声明要进行事务增强的切面,用tx:advice声明具体方法的事务属性,及应用到的事务管理器 3 ...

  6. SQLite入门与分析(四)---Page Cache之事务处理(1)

    写在前面:从本章开始,将对SQLite的每个模块进行讨论.讨论的顺序按照我阅读SQLite的顺序来进行,由于项目的需要,以及时间关系,不能给出一个完整的计划,但是我会先讨论我认为比较重要的内容.本节讨 ...

  7. Sqlite大批量导入数据提高效率的几种方式

    前言 SQLite数据库由于其简单.灵活.轻量.开源,已经被越来越多的被应用到中小型应用中.甚至有人说,SQLite完全可以用来取代c语言中的文件读写操作.因此我最近编写有关遥感数据处理的程序的时候, ...

  8. spring 配置sqlite的方式

    sqlite作为一种嵌入式数据库越来越受欢迎,特别是在小型的项目中,下面介绍两种spring配置sqlite数据库的方式 第一种:配置在tomcat目录下 1.在tomcat根目录下创建dbs文件夹, ...

  9. Qt操作SQLite数据库的三种方式

    Qt访问Sqlite数据库的三种方式(即使用三种类库去访问),分别为QSqlQuery.QSqlQueryModel.QSqlTableModel,对于这三种类库,可看为一个比一个上层,也就是封装的更 ...

最新文章

  1. [POJ1741]Tree
  2. 深入剖析Android系统
  3. Merge into的使用详解-你Merge了没有
  4. GIS讲堂第二课-地图切片简介以及OL中的调用
  5. linux开启内部路由转发功能
  6. eclipse创建Maven的动态web工程
  7. mvc2中如何在下拉列表中显示含有子类的项(子类前加--)
  8. 深度学习自学(七):腾讯移动端开源框架ncnn学习总结
  9. 技术人生:恶补基础知识
  10. MySQL 读写分离配置实践
  11. 免费试用一年微软云服务【图文并茂】
  12. 凡刻(Fenke)FK169机械手表测评
  13. 什么是MBR/DPT/DBR/BPB?
  14. shader 获取法线_Unity Shader教程 三、法线方向
  15. 学计算机轻松的表情包,轻松的表情包
  16. layui 给table里面的添加图标_layui教程---table
  17. SuperMap Desktop制作地图
  18. 网格顶点法向量从世界坐标到切空间坐标转换:法向贴图高低模烘焙
  19. 安卓Bmob后端云的使用(增删改查、上传图片、推送服务等)
  20. PLSQL连接Oracle:ORA-12154: TNS: 无法解析指定的连接标识符

热门文章

  1. 探索式软件测试—Exploratory Software Testing
  2. [wikioi 1307][poj 2054]欧少堆(乱搞)
  3. 静态连接库、动态链接库
  4. 不同国别的买家,谈判方式竟有如此大差异!
  5. 大话PM|产品设计中常被忽视的业务异常
  6. 我最近做产品的一些「感悟」
  7. 产品经理这个角色真的泡沫越来越大吗?
  8. TabBarItem的Badge
  9. 让用户来决定Windows任务管理器的CPU占用率
  10. C#中return语句的使用方法