1. reserved state
    进入reserved state以后,sqlite可以修改数据库中的内容,不过把修改以后的内容写到pager的缓存里,大小由page cache指定。
    进入这个状态以后,pager开始初始化日志文件,用户回滚和异常恢复。(其实就是把日志中的文件内容拷贝到数据库文件中去)
    这种机制使得数据库在进行写操作时可以同时进行读操作。
    不过由于只有一个reservedexclusive锁,所以只能有一个写操作
  2. pending state
    从reserved到exclusive要经历一个pending state,即获取pending锁。
    pending是一个gateway lock。

    • 不会有事务从unlock状态到shared状态,保证了不会有新的读操作和写操作
    • 已经拥有shared锁的事务可以正常运行。写事务等待着这些事务的完成,释放锁。
  3. Exclusive state
    当其他所有的数据库链接都释放了锁之后,整个数据库就只有一个写操作的事务了。进入Exclusive状态。

    1. pager检查日志文件已经被写到了磁盘中,调用fsync()系统调用(如果这个系统调用挂了,SQlite也没办法)

      • 如果SYNCHRONOUS PRAGMA是默认的设置,会调用一次sync操作。
      • 如果SYNCHRONOUS PRAGMA是FULL,会调用两次sync操作
      • 如果SYNCHRONOUS PRAGMA是NONE,不会调用sync操作
    2. pager把已经修改完的内容写入数据库文件
    3. 清理日志文件,释放锁

锁实现的原理

SQLite锁的实现是基于标准的文件锁。SQlite在数据库文件上有三个锁,1个reserved byte,一个pending byte以及一个shared region。

  1. unlocked->shared
    获取pending byte的读锁。获取成功以后,在shared region随机获得一个byte的读锁,并释放pending byte的读锁。
  2. shared->reserved
    获取reserved byte的写锁即可。
  3. reserved->exclusive
    首先获取pending byte的写锁。
    一旦成功,那么由于pending byte已经被锁定,因此不会有unlocked->shared。
    接下来,会尝试获取整个shared region的写锁。
    由于shared region有一些被active的事务持有读锁,因此数据库会等待这些事务完成并释放锁。

恢复机制

使用reserved byte来决定是否需要恢复。
一般来说,日志文件和reserved lock是同步的,即同时出现和消失。
如果SQLite发现了日志文件,却没有发现reserved lock,那么可以认为发生了crash或系统掉电。
当pager首次打开数据库或从数据库文件读取到内存时,会做一个完整性检查。如果发现不一致(有日志文件却没有reserved lock),那么数据库进入恢复模式。此时的数据库日志文件叫做hot journal。
进入恢复模式以后,会直接从shared状态进入pending状态,如第一个图的灰线所示。这样子可以保证
1. 不会有新的数据库连接
2. shared状态的数据库连接不会进入恢复模式(实际上不会发生,因为第一个数据库连接会进入恢复模式,从而阻塞其他的数据库连接进入shared状态)

简单的说,一个hot journal就是一个implicit exclusive锁。如果写操作crash了,那么在其他数据库连接成功恢复数据库以前,数据库不会有其他操作。crash以后第一个操作数据库的pager会看到hot journal,并进行数据库恢复。

关于文件锁

File locks really are just flags within the operating system kernel, usually. (The details depend on the specific OS layer interface.) Hence, the lock will instantly vanish if the operating system crashes or if there is a power loss. It is usually also the case that the lock will vanish if the process that created the lock exits.

sqlite锁的机制的更多相关文章

  1. Oracle锁的机制

    一.为什么要有锁的机制 我们都知道数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破 ...

  2. mysql查询更新时的锁表机制分析

    为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(t ...

  3. 3、JUC--ConcurrentHashMap 锁分段机制

    ConcurrentHashMap  Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能.  ConcurrentHashMap 同步容器 ...

  4. java多线程 -- ConcurrentHashMap 锁分段 机制

    hashtable效率低ConcurrentHashMap 线程安全,效率高 Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器 的性能. Conc ...

  5. SQLServer锁的机制

    SQLServer锁的机制:共享锁(S)排它锁(X)更新锁(U)意向共享 (IS)意向排它 (IX) 意向排它共享 (SIX)架构修改(Sch-M) 架构稳定性(Sch-S)大容量更新(BU)

  6. JUC——线程同步锁(锁处理机制简介)

    锁处理机制简介 juc的开发框架解决的核心问题是并发访问和数据安全操作问题,当进行并发访问的时候如果对于锁的控制不当,就会造成死锁这样的阻塞问题. 为了解决这样的缺陷,juc里面重新针对于锁的概念进行 ...

  7. mysql查询更新时的锁表机制分析(只介绍了MYISAM)

    为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(t ...

  8. 通过修改VAD属性破除锁页机制

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 技术学习来源:火哥(QQ:471194425) 注释:因为自己的知 ...

  9. 3.ConcurrentHashMap 锁分段机制 Copy-On-Write

    /*ConcurrentHashMap*/ Java 5.0 在 java.util.concurrent 包中提供了 多种 并发容器来改进同步容器的性能 ConcurrentHashMap 同步容器 ...

随机推荐

  1. Halcon与MFC交互编程

    Halcon是商业化的机器视觉软件.网上下了halcon10的破解版,安装后编写了个图像显示的MFC小程序. 编译器用的是VS2008. 1 配置halcon环境 新建为MFC后,在VC++目录中配置 ...

  2. PHP的反射机制

    在面向对象中最经典的使用就是反射,之前在Java语言中,使用反射可以解耦,用于依赖注入. 在PHP中,同样也有如此强大的地方,我们利用反射来获取一个对象的实例. 首先我们先写一个类: class Te ...

  3. 【转载】Memcached在.Net中的基本操作

    一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...

  4. C语言学习019:函数指针

    在C语言中,函数名也是指针变量,比如创建了一个add(int n,int m)的函数的同时也创建了一个名为add的指针变量,因此我们可以把函数指针当作一种类型为它赋值.当作参数传递等操作 C语言创建函 ...

  5. js中局部变量必须用var去声明

    js中的变量与其他的脚本语言都是很不一样的,在function中你如果不用var 声明一个变量,那么这个变量将在全局可见,也就相当于创建了全局变量.所以在function中声明变量尽量都是用var来声 ...

  6. LINQ TO SQL 大全

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 LINQ to SQL语句(1)之Where 适用场景: ...

  7. Java基础复习笔记系列 三

    前几节都是基础中的基础,从第三讲的笔记开始,每次笔记针对Java的一个知识块儿.  Java异常处理 1.什么是异常? 异常是指运行期出的错误.比如说:除以一个0:数组越界:读取的文件不存在. 异常处 ...

  8. Atitit.提升语言可读性原理与实践

    Atitit.提升语言可读性原理与实践 表1-1  语言评价标准和影响它们的语言特性1 1.3.1.2  正交性2 1.3.2.2  对抽象的支持3 1.3.2.3  表达性3 .6  语言设计中的权 ...

  9. MYSQL 练习

    导出现有数据库数据: mysqldump -u用户名 -p密码 数据库名称 >导出文件路径           # 结构+数据 mysqldump -u用户名 -p密码 -d 数据库名称 > ...

  10. mvc和iis工作原理

    学习IIS & MVC的运行原理 我一直疑惑于以下问题,从客户端发出一个请求,请求到达服务器端是怎样跟iis衔接起来的,而iis又是怎样读取我发布的代码的,并返回服务器上的文件.这其中是怎样的 ...