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

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

相关推荐
雾里看山7 小时前
源码目录、构建目录与 out-of-source build
c++·软件构建·cmake
剑之所向7 小时前
.NET 官方`System.Threading.Channels`
前端·javascript·数据库
词却8 小时前
数据库基础:DQL 数据查询语言
数据库·oracle
渡我白衣9 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
天下无敌笨笨熊9 小时前
C#Modbus串口开发心得
开发语言·c#
电商API_180079052479 小时前
电商商品价格监控工具淘宝京东商品价格抓取API项目实操分享
java·大数据·开发语言·前端·数据挖掘
zzzll11119 小时前
深度剖析:HashMap 并发死循环与 ConcurrentHashMap 两代演进全解
java·开发语言
如意猴9 小时前
【C++】001--C++入门(1)
开发语言·c++
hetao17338379 小时前
2026-09-01~09-04 hetao1733837 的刷题记录
c++·算法
传奇开心果编程9 小时前
【Rust入门知识点学与练】第10课:Option 和 Result(错误处理入门)
开发语言·学习·rust