什么是WAL模式

Sqlite使用WAL模式指南 本文阐述如何配置SQLite的WAL模式,实现数据库的读写并发。 阅读详情

什么是WAL?

WAL模式的全称是Write Ahead Logging,它是很多数据库中用于实现原子事务的一种机制,SQLite 3.7.0版本引入了该特性。Android 3.0 以上版本的SQLite 版本都大于3.7.0。
在WAL模式下,SQLite中除了db文件,还包含两个文件,.wal文件和.shm文件,前者是日志文件,后者是日志索引文件。

WAL工作原理

在引入WAL机制之前,SQLite使用rollback journal机制实现原子事务。

rollback journal机制的原理是:在修改数据库文件中的数据之前,先将修改所在分页中的数据备份在另外一个地方,然后才将修改写入到数据库文件中;如果事务失败,则将备份数据拷贝回来,撤销修改;如果事务成功,则删除备份数据,提交修改。

WAL机制的原理是:修改并不直接写入到数据库文件中,而是写入到另外一个称为WAL的文件中;如果事务失败,WAL中的记录会被忽略,撤销修改;如果事务成功,它将在随后的某个时间被写回到数据库文件中,提交修改。

同步WAL文件和数据库文件的行为被称为checkpoint(检查点),它由SQLite自动执行,默认是在WAL文件积累到1000页修改的时候;当然,在适当的时候,也可以手动执行checkpoint,SQLite提供了相关的接口。执行checkpoint之后,WAL文件会被清空。

在读的时候,SQLite将在WAL文件中搜索,找到最后一个写入点,记住它,并忽略在此之后的写入点(这保证了读写和读读可以并行执行);随后,它确定所要读的数据所在页是否在WAL文件中,如果在,则读WAL文件中的数据,如果不在,则直接读数据库文件中的数据。

在写的时候,SQLite将之写入到WAL文件中即可,但是必须保证独占写入,因此写写之间不能并行执行。

开启WAL模式可以提高写入数据库的速度,读和写之间不会阻塞,但是写与写之间依然是阻塞的。在项目中开启WAL模式,可以提高并发。由于使用WAL比rollback journal的模式减少了写的i/o,所以写入时速度较快,但是由于在读取数据时也需要读取WAL日志验证数据的正确性,所以读取数据相对要慢。

WAL的优点与缺点

优点:

  1.读和写可以完全地并发执行,不会互相阻塞(但是写之间仍然不能并发)。

  2.WAL在大多数情况下,拥有更好的性能(因为无需每次写入时都要写两个文件)。

  3.磁盘I/O行为更容易被预测。

缺点:

  1.访问数据库的所有程序必须在同一主机上,且支持共享内存技术。

  2.每个数据库现在对应3个文件:<yourdb>.db,<yourdb>-wal,<yourdb>-shm。

  3.当写入数据达到GB级的时候,数据库性能将下降。

  4.3.7.0之前的SQLite无法识别启用了WAL机制的数据库文件。

WAL引入的兼容性问题

  在启用了WAL之后,数据库文件格式的版本号由1升级到了2,因此,3.7.0之前的SQLite无法识别启用了WAL机制的数据库文件。

  禁用WAL会使数据库文件格式的版本号恢复到1,从而可以被SQLite 3.7.0之前的版本识别。

WAL引入的性能问题

  在一般情况下,WAL会提高SQLite的事务性能;但是在某些极端情况下,却会导致SQLite事务性能的下降。

  1.在事务执行时间较长或者要修改的数据量达到GB级的时候,WAL文件会被占用,它会暂时阻止checkpoint的执行(checkpoint会清空WAL文件),这将导致WAL文件变得很大,增加寻址时间,最终导致读写性能的下降。

  2.当checkpoint执行的时候,会降低当时的读写性能,因此,WAL可能会导致周期性的性能下降。
sqlite wal 分析 动手点关注干货不迷路sqlite 提供了一种 redo log 型事务实现,支持读写的并发,见write-ahead log(https://sqlite.org/wal.html)。本文将介绍 wal 原理,并源码剖析 checkpoint 过程,同时讨论下 wal 使用中的一些注意点。由于 sqlite 的复杂性,会省略掉一些细节,重点放在核心流程和 wal 并发的实现。1. wal 原理1... 阅读详情

相关推荐

SQLite WAL模式深度解析:并发读写优化与实战揭秘

SQLite WAL模式核心技术解析 SQLite的WAL(预写日志)模式是一种突破性的并发优化方案,主要解决传统DELETE模式下的读写互斥问题。核心优势包括: 并发性能:支持1个写操作和多个读操作同时执行 ACID保障:保持事务特性,崩溃后可恢复 无缝迁移:仅需PRAGMA journal_mode=WAL即可启用 关键技术实现: 写操作先记录到.wal文件,不直接修改主数据库 读操作通过合并主数据库和wal日志获取最新数据 数据库级模式切换,所有连接自动适配 实战案例显示,WAL模式下查询进程可每秒执

文石_2009的博客 515

sqlite的wal模式

原文:https://www.sqlite.org/wal.html 预览 SQLite实现原子提交和回滚的默认方法是回滚日志。从3.7.0版本(2010-07-21)开始,可以使用一个新的“写前日志”选项(以下称为“WAL”)。 wal模式优点 大部分情况下,wal模式要比其他模式快很多; wal提供了更多的并发性,读时不会阻塞写,写时不会阻塞读; 使用wal使得磁盘IO操作更加连续; wal使用的fsync()操作要少得多,因此在fsync()系统调用中断的系统上,不太容易出现问题; wa

u010227042的博客 3564

【0249】WAL Modes(WAL模式,synchronous_commit)深入分析

当服务器正常运行时,WAL文件不断被写入磁盘。但是,这些写入是顺序的:几乎没有随机访问,因此即使是hdd也可以处理这个任务。由于这种类型的加载与典型的数据文件访问非常不同,因此有必要为WAL文件设置一个单独的物理存储,并用一个指向已挂载文件系统中的目录的符号链接替换目录。有几种情况下,WAL文件必须同时写入和读取。第一个是明显的崩溃恢复案例;第二种是流复制。walsender进程直接从文件中读取WAL条目。

Postgres 数据库内核开发工程师 362

如何解决SQLite中多线程写入冲突问题?

WAL =传统模式(默认叫DELETE开始写入前会把原始数据库文件锁住;写入修改数据;提交事务时写回数据库文件;同时清理之前的日志文件。这种方式的最大问题是——写入会锁住整个数据库文件,导致别的线程/进程不能同时读或写。模式特点DELETE(默认)每次写入会锁住整个库,性能低,冲突多WAL写入先写日志文件,读写可并行,性能好,锁少需要的话,我还可以帮你检查你项目中是否适合开启 WAL,或者是否还需要添加自动 checkpoint 机制。你这边主要是读多还是写多?

weixin_53135464的博客 1894

基于OpenMV与双舵机云台的激光追踪系统实战解析

本文详细解析了基于OpenMV摄像头与双舵机云台的激光追踪系统设计与实现。从硬件选型、图像识别算法到PID控制逻辑,全面介绍了如何构建一个高效稳定的激光追踪系统,并分享了电子设计竞赛中的实战经验与调试技巧。该系统在智能玩具、安防监控及教学演示等领域具有广泛应用前景。

prometheus9mon的博客 261

代号OneNET02 STM32+ESP8266 WIFI系列-第2节-STM32单片机通过ESP8266连接WIFI访问OneNET OTA服务器实现SOTA远程程序升级

第2节-STM32单片机通过ESP8266连接WIFI访问OneNET OTA服务器实现SOTA远程程序升级,这一节主要是实现通过OneNET OTA服务器将需要更新的程序远程下载到STM32单片机,这一节主要是引导程序和应用程序的讲解。

weixin_44862509的博客 1904

数据库 wal 模式 分析

对于以下错误的解决思路   看我的另外一篇文章 https://blog.youkuaiyun.com/tianxuhong/article/details/78752357  android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14)   ▼ 目录 1.概述 2...

明风的博客 7074

《AI大模型评测与智能测试》

第三篇“实践蓝图”(第6-7章)着眼于测试领域AI应用,重点介绍了RAG、AI Agent开发及构建端到端智能测试系统的方法。本书聚焦AI时代的“质量”核心,以“AI赋能测试”(AI For Testing)与“AI模型评测”(Testing For AI)为双轮驱动。内容不仅深入剖析如何科学度量AI大模型的内在质量,还系统讲解如何利用AI赋能传统软件测试,帮助读者贯通从模型原理、评测到应用开发的全链路知识。

酌沧 1138

android wal模式,WCDB 的 WAL 模式和异步 Checkpoint

WAL 模式是 SQLite 3.7.0 版本推出的改进写性能和并发性的功能,至今已经7年多了,但由于WAL是默认关闭的,可能有相当多的应用并没有用上,仍然使用性能较差的传统模式。微信 APP 开启了 WAL 模式,同时还针对 WAL 做了一点改进 —— 异步 Checkpoint。通过 A/B Test,最终相比传统 Rollback 模式写耗时减少 70% 以上,还稍稍降低了 DB 损坏率。W...

weixin_29014939的博客 773

基于Dify实现对Excel的数据分析

在dify部署完成后,大家就可以基于此进行各种应用场景建设,目前dify支持聊天助手(包括对话工作流)、工作流、agent等模式的场景建设,我们在日常工作中经常会遇到各种各样的数据清洗、格式转换处理、数据统计成图等数据分析工作,本次主要基于对话工作流模式对Excel文件、csv文件进行解析处理,并进行成图等数据分析工作。主要用到的插件有LLM节点,文档提取器、参数提取器、自定义代码节点、echart插件等。实现解析Excel数据,经过上述不同节点的处理分析流程,最终实现数据统计图展示。

hhue2007的专栏 1万+

DLMS/COSEM协议的理解体会

DLMS是通信协议,COSEM是电表建模规范。HDLC帧基本格式为0x7e......

一个bug是bug,多个bug能work 8312

Sqlite3 WAL模式

转:http://www.cnblogs.com/wuhenke/archive/2011/11/20/2256618.html  从3.7.0版本(对应iOS 4.3)开始,SQLite还提供了Write-Ahead Logging模式。与delete模式相比,WAL模式在大部分情况下更快,并发性更好,读和写之间互不阻塞;而其缺点对于iPhone这种嵌入式设备来说可以忽略,只需注意不要

hmxiao_1983的专栏 1580

【GPFS专题5】---IBM Spectrum Scale (GPFS) 日常运维命令大全

掌握这些命令是有效管理 GPFS 集群的基础。实际生产环境中,建议结合自动化脚本和监控系统(如 IBM Storage Insights)实现高效运维。定期备份配置、监控性能指标,并进行灾备演练,是保障数据安全和系统稳定的关键。

jundao1997的专栏 839

WAL模式 Android,Android使用SQLITE3 WAL模式

sqlite是支持writeaheadlogging(WAL)模式的,开启WAL模式可以提高写入数据库的速度,读和写之间不会阻塞,但是写与写之间依然是阻塞的,但是如果使用默认的TRUNCsqlite是支持write ahead logging(WAL)模式的,开启WAL模式可以提高写入数据库的速度,读和写之间不会阻塞,但是写与写之间依然是阻塞的,但是如果使用默认的TRUNCATE模式,当写入数据时...

weixin_33565515的博客 828

C#上位机+YOLO实时目标检测:摄像头采集+多线程推理+精度调优全流程

标注数据集:使用LabelImg工具标注目标对象,按YOLO格式整理数据集;模型训练:使用Ultralytics库训练自定义模型,提升特定目标的检测精度;训练参数优化:增加训练轮数(epochs=100200)、调整批次大小(batch=1632)、使用数据增强(flip、mosaic等)。摄像头采集:封装通用采集类,支持USB摄像头/网口相机,实现稳定帧读取与异常处理;多线程推理:采用“采集线程+推理线程+UI线程”解耦架构,使用线程安全队列传递帧数据,彻底解决界面卡顿;核心封装。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 671

【Charge】仿真目录

Author: JiJi\textrm{Author: JiJi}Author: JiJi Created Time: 2026.01.20\textrm{Created Time: 2026.01.20}Created Time: 2026.01.20 Modified Time: 2026.01.20\textrm{Modified Time: 2026.01.20}Modified Time: 2026.01.20工作流程材料模型[Charge] 电荷分布与折射率变化理论 [Charge] FDTD

u011699626的博客 312

Android wal模式

Android wal模式

Qxnedy的博客 1214

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

GreenDao使用SQLite的WAL模式

GRDB使用SQLite的WAL模式 WAL全称是Write Ahead Logging,它是SQLite中实现原子事务的一种机制。该模式是从SQLite 3.7.0版本引入的。再此之前,SQLite使用Rollback Journal机制实现原子事务。在Rollback Journal机制中,当需要修改数据时,先把被修改的数据备份出来,然后把数据库的数据修改。如果事务成功,就把备份数据删掉;如果事务失败,则恢复备份数据。这个机制的缺点是读写频繁,并且写的时候,不能读取。 而WAL模式的工作..

u010227042的博客 639

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

WAL模式 Android,SQLite 数据库 WAL 工作模式原理简介

闪存对象序列化系列数据序列化系列(待更)《Android 数据序列化之 JSON》《Android 数据序列化之 Protocol Buffer 使用》《Android 数据序列化之 Protocol Buffer 源码分析》SQLite 存储系列SQLite WAL 模式工作原理分析什么是 WALWAL 的全称是 Write Ahead Logging(预写日志),它是很多数据库中用于实现原子事...

weixin_29382705的博客 660

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android wal模式,android - Disable WAL mode - Stack Overflow

It seems like my solution is not working and I don't know why. Here is what I try:LogicMy app has a single database instance and if this instance is created does following:Get current database modeIf ...

weixin_39565910的博客 222

sqlite3 wal模式

转:http://www.cnblogs.com/wuhenke/archive/2011/11/20/2256618.html  从3.7.0版本(对应iOS 4.3)开始,SQLite还提供了Write-Ahead Logging模式。与delete模式相比,WAL模式在大部分情况下更快,并发性更好,读和写之间互不阻塞;而其缺点对于iPhone这种嵌入式设备来说可以忽略,只需注意不要以只读方

zzqhost的专栏 9120

GRDB使用SQLite的WAL模式

GRDB使用SQLite的WAL模式

大学霸__IT达人 931

sqlite之WAL模式

链接 概述 在3.7.0以后,WAL(Write-Ahead Log)模式可以使用,是另一种实现事务原子性的方法。 WAL的优点 在大多数情况下更快 并行性更高。因为读操作和写操作可以并行。 文件IO更加有序化,串行化(more sequential) 使用fsync()的次数更少,在fsync()调用时好时坏的机器上较为未定。 缺点 一般情况下需要VFS支持共享内存模式。(sh...

weixin_30747253的博客 684

sqlist wal模式

WAL(Write-Ahead Log)是SQLite的预写式日志,核心是。看到一个用rust重写sqlist的项目在解决这个问题,随手普及记录一下。回滚日志下写操作会锁定数据库,读操作需等待写锁释放。回滚日志崩溃时,根据日志恢复被修改页的旧数据。WAL 重启时重放日志中的修改到数据库;WAL模式与传统回滚日志模式的核心区别。(相当于 又加了一个文件 解决问题)回滚日志是原地修改+写回滚页,WAL 是追加写日志,修改先。,保证事务原子性与持久性。

No Game No Life 244
上一篇: IO模型中的BIO,NIO和AIO有什么区别
下一篇: 浏览器的工作原理:URL从键入到页面显示的过程究竟发生了什么
code_feien
博客等级 码龄7年 71粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值