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

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

相关推荐
码匠许师傅5 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
2603_965148115 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
ltl5 小时前
RocksDB 经典故障排查:L0、compaction 与 write stall
数据库
xfhuangfu6 小时前
Oracle中建立到CDB和PDB的连接
数据库·oracle·rpc
小小龙学IT6 小时前
DuckDB 深度实战:用 C++ 在进程内跑一个「分析型数据库」
数据库·c++
NineData7 小时前
DTCC 2026 预告|NineData CEO& 创始人叶正盛:面向 AI Agent 的数据库 DevOps 与数据复制实践
数据库·人工智能·数据库开发·devops·ninedata·数据库技术·dtcc
J_bean7 小时前
MySQL 事务是否必须手动开启?
数据库·mysql·数据库事务·自动提交·手动提交
J_bean7 小时前
MySQL InnoDB 如何检测死锁、判定死锁、处理死锁
数据库·mysql·死锁·死锁检测·处理死锁·死锁判定
知无不研8 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
浪子明X8 小时前
从 MongoDB 文档到关系模型:构建可重跑、可对账的数据迁移流水线
数据库·mongodb·oracle