当前位置: 首页 > news >正文

【sqlite】xxx.db-journal是什么?

sqlite是单文件数据库,但仅凭一个文件是做不到“先写日志,后入库,断电依然可恢复”的

那么就需要xxx.db-journal

BEGIN TRANSACTION;不会产生xxx.db-journal
CREATE TABLE不会产生xxx.db-journal
SELECT不会产生xxx.db-journal

仅当INSERT/UPDATE/DELETE时,会产生xxx.db-journal

对于一次插入操作:

  • 首先立即创建 -journal 文件并写入头信息。
  • 然后对于该语句将要修改的数据库页,先将它们的原始内容复制到 -journal 文件中。
  • 最后才执行 INSERT 语句,将修改写入内存中的数据库页缓存。

journal文件的结构如下:

offsetsize描述
08标头字符串:0xd9、0xd5、0x05、0xf9、0x20、0xa1、0x63、0xd7
84“页数” - 日志下一段的页数,或 -1 表示所有内容到文件末尾
124校验和的随机数
164数据库的初始大小(以页为单位)
204写入此journal的进程所假定的磁盘扇区的大小。
244本journal的页面大小。
28N用0填充,直到填满这个扇区,是为了头不被破坏
以下3行不断重复
28+N+04这个页原来是来自数据库的第几页
28+N+40x1000Transaction开始前,页面原始内容,相当于整个页面拷贝过来。
28+N+4+0x10004校验和的随机数,跟前面那个相等

代码如下。可以发现journal随着insert创建,一旦提交,journal就被删除。

#include <stdio.h>
#include "sqlite3.h"int main() {sqlite3* db;char* err_msg = NULL;int rc;// 删除之前的测试数据库(如果存在)remove("int.db");// 打开数据库连接rc = sqlite3_open("int.db", &db);if (rc != SQLITE_OK) {fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));return 1;}printf("1. 数据库连接已建立\n");// 创建测试表const char* create_table_sql ="CREATE TABLE test_ints (""tiny INT,""small INT, ""medium INT,""large INT,""negative INT"")";rc = sqlite3_exec(db, create_table_sql, NULL, NULL, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "创建表失败: %s\n", err_msg);sqlite3_free(err_msg);return 1;}printf("2. 测试表已创建\n");// 开始一个事务(显式开始)rc = sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "开始事务失败: %s\n", err_msg);sqlite3_free(err_msg);return 1;}// 插入数据但不提交const char* insert_sql ="INSERT INTO test_ints VALUES (1, 128, 32768, 2147483647, -1);""INSERT INTO test_ints VALUES (127, 255, 65535, 4294967295, -128);""INSERT INTO test_ints VALUES (0, 16384, 1000000, 1000000000, -32768);";rc = sqlite3_exec(db, insert_sql, NULL, NULL, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "插入数据失败: %s\n", err_msg);sqlite3_free(err_msg);return 1;}printf("3. 插入数据完成\n");// 提交事务rc = sqlite3_exec(db, "COMMIT;", NULL, NULL, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "提交事务失败: %s\n", err_msg);sqlite3_free(err_msg);}else {printf("4. 事务已提交\n");}printf("5. 准备工作完成\n");// 开始一个事务(显式开始)rc = sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "开始事务失败: %s\n", err_msg);sqlite3_free(err_msg);return 1;}printf("6. 第二次事务已开始\n");// 插入数据但不提交const char* insert_sql2 ="INSERT INTO test_ints VALUES (-128, -128, -128, -128, -128);";rc = sqlite3_exec(db, insert_sql2, NULL, NULL, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "插入数据失败: %s\n", err_msg);sqlite3_free(err_msg);return 1;}printf("7. 第二次插入完成\n");sqlite3_close(db);return 0;
}
http://www.dtcms.com/a/486328.html

相关文章:

  • Ubuntu 搭建 Samba 文件共享服务器完全指南
  • ubuntu server版本安装vmtool
  • 《Redis库基础使用》
  • 网站转应用济南网站优化推广公司电话
  • 探索libsignal:为Signal提供强大加密保障的开源库
  • PIL与OpenCV双线性插值实现差异导致模型精度不够踩坑
  • 逆合成孔径雷达成像的MATLAB算法实现
  • 网站定制建设公司启信宝企业查询官网
  • html案例:制作一个图片水印生成器,防止复印件被滥用
  • 最新版谷歌浏览器集成知笺云阅读器控件介绍
  • 嘉定装饰装修网站企业网络营销青岛
  • break,continue练习题
  • 【Ubuntu 24.04.3 LTS(Noble Numbat)】移动硬盘数据提取操作手册
  • 网站开发需求分析与功能设计互联网线上推广是什么工作
  • 做网站前应该怎么处理微信推广文案范文
  • 35.渗透-.Kali Linux-工具-反弹shell生成器
  • 便携式水质监测仪——快速锁定水质污染
  • Redis String原理
  • 旅游网站功能流程图php wordpress教程
  • adminPage-vue3依赖LoadingWrap说明文档,表单页快速开发,使用思路及范例-汇总
  • 八股已死、场景当立(场景篇-JVM)
  • 【MySQL】主从复制
  • C4D域的常规修改层:功能详解与实用技巧
  • 网站后台管理系统模板仿西部数码网站
  • 外贸网站电子建设网站免费推广平台有哪些
  • 【汽车篇】AI深度学习在汽车轮胎X-ray缺陷检测应用方案
  • Jmeter循环控制器,IF控制器,正则表达式
  • 【qt学习】day1登录界面模仿
  • 一款优秀的桌面辅助软件
  • 2025-陇剑杯决赛-ezTraffic