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模式的概念和特点。希望你能有所收获。

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

相关推荐
唐樽几秒前
C++ 竞赛学习路线笔记
c++·笔记·学习
ShineWinsu1 分钟前
对于Linux:文件操作以及文件IO的解析
linux·c++·面试·笔试·io·shell·文件操作
supericeice6 分钟前
创邻科技 Galaxybase Graph Intelligence 图智能平台:一站式可视化图数据存储、图计算与图挖掘平台
数据库·科技
heimeiyingwang11 分钟前
【架构实战】NewSQL数据库对比(TiDB/CockroachDB)
数据库·架构·tidb
buhuimaren_13 分钟前
pg日常维护
数据库·oracle
大虾别跑13 分钟前
Oracle迁移
数据库·oracle
Trouvaille ~17 分钟前
【MySQL篇】数据库操作:从创建到管理
linux·数据库·mysql·oracle·xshell·ddl
十五年专注C++开发26 分钟前
Oat++: 一个轻量级、高性能、零依赖的 C++ Web 框架
开发语言·c++·web服务·oatpp
陈天伟教授27 分钟前
心电心音同步分析-案例:原型设计一
开发语言·人工智能·python·语言模型·架构
Allen_LVyingbo30 分钟前
量子计算Dirac Notation基本教学—从零基础到读懂量子信息论文(下)
开发语言·人工智能·python·数学建模·量子计算