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

dka*_*ich 2 c database memory sqlite sqlite-journal-mode

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

mvp*_*mvp 5

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

请注意,SQLite 文档将检查点定义为将 WAL 文件事务移回数据库。换句话说,检查点从 WAL 中移动一个或多个事务,但不是巨大的未提交事务的一部分。

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

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