sqlite锁机制概述

SQLite的锁机制以数据库级别进行,降低读写并发但简化设计。读事务经历UNLOCKED->PENDING->SHARED,写事务还需经过RESERVED和EXCLUSIVE。通过PENDING_LOCK避免写饿死,但可能导致死锁,解决办法是锁超时。适用于少写多读场景。
摘要由CSDN通过智能技术生成

sqlite的锁的粒度比较粗,是数据库级别的,也就是说即使只是对某个页进行读写操作,sqlite也会封锁整个数据库。这种策略降低了读-写事务和写-写事务间的并发程度,但是大大简化了程序设计,减小了整个程序的大小。所以,sqlite的适用场景为:较少次写入数据,大量、多次读出数据。这也是sqlite作为一款嵌入式数据库的设计初衷。

读、写事务获取锁的过程

sqlite读事务获取锁的过程:UNLOCKED->PENDING->SHARED->进行读取操作
sqlite写事务获取锁的过程:UNLOCKED->PENDING->SHARED->RESERVED->创建回滚日志,在数据库内存页中写入数据,刷新日志文件到磁盘->PENDING->EXCLUSIVE->刷新内存页中的数据到磁盘。

锁的byte

在windows平台,sqlite使用了LockFile(),LockFileEx(),UnlockFile(),UnlockFileEx()这几个API实现锁。锁机制的实现是通过封锁一个在文件1GB处的大小为512B的文件页内的字节实现的。其中:
#define PENDING_BYTE (0x40000000)
#define RESERVED_BYTE (PENDING_BYTE+1)
#define SHARED_FIRST (PENDING_BYTE+2)
#define SHARED_SIZE 510

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值