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 分钟前
【性能测试】3_性能测试基础 _指标
运维·服务器·数据库·性能测试·性能测试指标
+VX:Fegn08958 分钟前
计算机毕业设计|基于springboot + vue物流配送中心信息化管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·小程序·课程设计
随丶芯8 分钟前
IDEA安装leetcode-editor插件
java·开发语言
Ccjf酷儿22 分钟前
C++语言程序设计 (郑莉)第六章 数组、指针和字符串
开发语言·c++
禹曦a24 分钟前
Java实战:Spring Boot 构建电商订单管理系统RESTful API
java·开发语言·spring boot·后端·restful
superman超哥24 分钟前
精确大小迭代器(ExactSizeIterator):Rust性能优化的隐藏利器
开发语言·后端·rust·编程语言·rust性能优化·精确大小迭代器
芒克芒克24 分钟前
虚拟机类加载机制
java·开发语言·jvm
陌路2025 分钟前
C++28 STL容器--array
开发语言·c++
im_AMBER32 分钟前
Leetcode 100 在链表中插入最大公约数
数据结构·c++·笔记·学习·算法·leetcode·链表
FPGAI33 分钟前
Python之函数
开发语言·python