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