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

时间:2013-07-20 07:08:45

标签: c database sqlite memory sqlite-journal-mode

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

1 个答案:

答案 0 :(得分:4)

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

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

您的问题可能解决方案很少:

  • 避免大量交易 - 如果可以的话,提交较小的块。当然,根据您的应用,这并不总是可行的。
  • 使用PRAGMA journal_mode=DELETE的旧日记模式。它比新的WAL模式(PRAGMA journal_mode=WAL)略慢,但根据我的经验,它往往会创建更小的日志文件,并在事务成功提交时被删除。例如,Android 4.x仍在使用旧的日记模式 - 它在Flash上​​运行速度更快,并且不会创建大量的临时或日志文件。