Sqlite3 锁升级机制

Sqlite3为了最大程度的提高多线程间的并发访问,采用了锁升级的机制。

未加锁:

还未和数据库建立连接、如果已经建立连接但是还没访问数据库、又或者使用了BEGIN开始了一个事务但未开始读写数据库,处于这些情形时是未加锁状态。

共享锁(又称:读锁)

从数据库中读取数据时,需要申请获得一个共享锁,如果获得成功,则进入共享状态。

预定锁:(预定一个锁,此时先将数据写入缓冲区)

连接需要写数据库时,首先申请一个预留锁,一个数据库同时只能有一个预留锁,预留锁可以与共享锁共存。获得预留锁后进入预留状态,这时会先在缓冲区中进行需要的修改、更新操作,操作后的结果依然保存在缓冲区中,未真正写入数据库。

待定锁:(待定的一个锁,准备提升为排他锁,不允许其他事务申请共享锁不允许读数据,如果在预定锁阶段有事务进入了共享锁那么在待定锁这个阶段需要等共享锁都释放掉)

连接从预留升为排它前,需要先升为未决,这时其它连接就不能获得共享锁了,但已经拥有共享锁的连接仍然可以继续正常读数据库,此时,拥有未决锁的连接等待其它拥有共享锁的连接完成工作并释放其共享锁后,提成到排它锁。

排它锁(又称:写锁):

需要提交修改时,需要将预留锁升为排它锁,这时其它连接都无法获得任何锁,直到当前连接的排它状态结束。

综以上所述,Sqlite3的隔离级别是:读已提交。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLite3的机制主要分为共享(Shared Lock)、排他(Exclusive Lock)和共享-排他(Shared-Exclusive Lock)三种。 共享:当一个事务对某个表或某个表的某个部分加上共享时,其他事务也可以对该表或该部分加上共享,但是不能对该表或该部分加上排他。当一个事务对某个表或某个表的某个部分加上共享时,该事务可以读取该表或该部分的数据,但是不能修改该表或该部分的数据。 排他:当一个事务对某个表或某个表的某个部分加上排他时,其他事务不能对该表或该部分加上任何类型的。当一个事务对某个表或某个表的某个部分加上排他时,该事务既可以读取该表或该部分的数据,也可以修改该表或该部分的数据。 共享-排他:当一个事务对某个表或某个表的某个部分加上共享-排他时,如果其他事务已经对该表或该部分加上共享,则该事务只能等待其他事务释放该共享;如果其他事务已经对该表或该部分加上排他,则该事务只能等待其他事务释放该排他。当一个事务对某个表或某个表的某个部分加上共享-排他时,该事务既可以读取该表或该部分的数据,也可以修改该表或该部分的数据。 SQLite3的机制是基于多版本并发控制(MVCC)实现的,即每个事务都可以读取该表的旧版本,而不会被其他事务的修改所影响,同时也可以对该表进行修改,修改后的结果会被保存为新版本,其他事务可以读取到该表的新版本或旧版本。在MVCC机制下,SQLite3可以实现高并发和高效的读写操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值