c - 可以在事务期间检查 WAL 文件吗?

标签 c database sqlite memory sqlite-journal-mode

我们正在 SQLite 数据库上执行相当大的事务,这导致 WAL 文件变得非常大。 (对于大型事务,有时高达 1GB。)有没有办法在事务过程中检查 WAL 文件?当我尝试调用 sqlite3_wal_checkpoint() 或执行 WAL 检查点 PRAGMA 语句时,两者都会返回 SQLITE_BUSY。

最佳答案

不是真的。这就是事务的全部要点:WAL(或日志文件)保存一旦成功提交就会成为正式数据的数据。在此之前,如果出现任何问题 - 程序崩溃、计算机重新启动等,WAL 或日志文件允许安全地回滚(撤消)未提交的操作。仅移动此未提交事务的一部分将达不到目的。

请注意,SQLite 文档将检查点定义为 moving the WAL file transactions back into the database 。换句话说,检查点从 WAL 中移动一个或多个事务,但不是巨大的未提交事务的一部分。

您的问题有几种可能的解决方案:

  • 避免巨大的事务 - 如果可以的话,以较小的 block 提交。当然,这并不总是可行,具体取决于您的应用程序。
  • 通过 PRAGMA Journal_mode=DELETE 使用旧的日记模式。它比新的 WAL 模式(使用 PRAGMAjournal_mode=WAL)稍慢,但根据我的经验,它往往会创建更小的日志文件,并且当事务成功提交时它们会被删除。例如,Android 4.x 仍在使用旧的日志模式 - 它往往在闪存上运行得更快,并且不会创建巨大的临时或日志文件。

关于c - 可以在事务期间检查 WAL 文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17759706/

相关文章:

database - Postgres 写/读锁

android - 将图像插入数据库并检索它

C链表: head is changing

交叉编译 Ubuntu 树莓派

c - 餐厅模拟

database - spring自动生成数据库模型类

c - 尝试使用 realloc(),导致核心转储

c# - 使用文本框条目过滤具有 int 值的 datagridview? VS C#

python - 为什么这个 sqlite3 insert 语句不添加行?

mysql - 从一个表中选择查询以检查列中是否存在相同的值,mysql select query