SQLITE问题整理

博主介绍:程序喵大人

前言

用过sqlite的朋友都知道,在数据库目录会有xxx.db文件,你可能看到过,其实数据库不只有xxx.db,有时候还会有xxx.db-shm、xxx.db-wal、xxx.db-journal等文件,你有想过这些文件的作用是什么吗?还有使用数据库时,偶尔会报SQLITE_BUSY或者SQLITE_LOCKED的错误,你知道是因为什么导致的吗?请看正文。

知识点

  • db-shm、db-wal、db-journal文件的作用是什么?
  • SQLITE_BUSY是什么导致的?
  • SQLITE_LOCKED是什么导致的?

db-shm、db-wal、db-journal文件,这些是什么?

db文件:db文件就是我们理解的常规的数据库文件

db-journal文件:一般数据库事务中会用到,在数据回滚时,用作回滚日志

db-wal文件:需要手动开启wal模式,开启wal模式后,数据库修改日志会先写在wal文件中,事务提交后,会写在db文件中,主要用作协调并发访问。

db-shm文件:用于共享内存和协调并发访问,存储了数据库连接中的锁信息和同步机制,数据库启用WAL模式后创建,数据库关闭时删除。

WAL模式是什么?

WAL需要手动开启,它是sqlite的一种日志模式,会将写操作记录到一个单独的日志文件(db-wal)中实现高效的并发读写操作。

它主要有两个特点:

写操作:写操作首先记录到db-wal文件中宏,不是直接写入主数据库文件。

并发读写:wal模式允许多个读操作和和一个写操作同时执行。

SQLITE_BUSY原因

一般是不同的数据库连接(通常是不同的进程)之间存在冲突才会导致SQLITE_BUSY,注意一般是多进程操作一个数据库才会出现此问题。

例如:一个进程在一个连接上读,另一个进程在不同的连接上读或者写,会SQLITE_BUSY。

详见:

https://www.sqlite.org/rescode.html#busy

SQLITE_LOCKED原因

一般是同一个数据库连接内,或使用共享内存的不同连接之间存在冲突,注意一般是一个进程内的多线程操作导致此问题。

例如:同一个连接上,一个线程读表,一个线程删表,会SQLITE_LOCKED

详见:

https://www.sqlite.org/rescode.html#locked

总结

本文主要介绍了db-shm, db-wal, db-journal文件的作用, SQLITE_BUSY和 SQLITE_LOCKED错误的原因,以及WAL模式的概念和特点。希望你能有所收获。

码字不易,欢迎大家点赞,关注,评论,谢谢!

相关推荐
Pniubi1 小时前
HashMap的扩容和树化边界
java·开发语言
gCode Teacher 格码致知2 小时前
Pandas教学-17:Series与Dataframe的关系
开发语言·python·pandas
发量惊人的中年网工2 小时前
分公司访问总部ERP慢怎么办?SD-WAN组网的排查与验收要点
服务器·开发语言·php
下页、再停留3 小时前
【C#桌面客户端系列学习-15】生成可视化图表之折线图、柱状图、饼状图
开发语言·c#
ShineWinsu3 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
zyseo83 小时前
谷歌SEO 准首页词挖掘脚本:找出排在第 8-20 名的隐藏流量
大数据·数据库·人工智能
益莱储中国4 小时前
深度解析:RF 实验室从 5G迈向 6G 的过程中保持技术领先与设备升级的路径
开发语言·php
xiaogai_gai5 小时前
仅查询策略实战:从金蝶云·星空旗舰版定时拉取收料通知单
大数据·数据库·python
丰色木夕5 小时前
Ubuntu22.04下源码编译安装USD-Brep
c++·ubuntu·nvidia·usd-brep
数据工匠老o5 小时前
异构数据库DDL同步:260条链路的结构变更自动适配方案
数据库·架构