sqlite3 相关知识

WAL 模式 VS 回滚模式

特性 WAL 模式 回滚模式(Rollback Journal)
定义 使用写前日志来记录变更。 使用回滚日志来记录事务的所有修改。
特点 更高的并发性和性能;支持多读者和单写者。 支持安全的事务回滚,但并发性较低。
性能 写入性能更好,尤其是读多写少的场景。 写操作会造成较大的性能开销,尤其是在事务开始时。
写入流程 数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。 数据在开始事务时写入日志文件,完成后再更新主数据库。
读操作 读取主数据库时不需要排队,因此多个读者可以平行读取。 当写入时,读取者可能会被阻塞,直到写入完成。
数据完整性 数据可以在写入过程中保持完整,写入发生之前可以回退。 在异常情况下,使用回滚日志恢复数据,但会使写性能降低。
空间使用 WAL 文件会持续增大,直到执行 CHECKPOINT 操作。 日志文件会在事务完成后被删除,空间使用相对较小。
CHECKPOINT 操作 定期将 WAL 文件中的数据合并到主数据库。 不需要 CHECKPOINT 操作,事务完成后立即释放日志文件。
数据恢复 可以在 WAL 文件中恢复未提交的事务。 通过回滚日志恢复未完成的事务。
配置复杂性 需要手动控制 WAL 文件刷新和 CHECKPOINT。 相对简单,主要关注事务和日志保存。
适用场景 - 读多写少的应用
- 高并发读取的应用
- 需要快速响应的桌面应用或移动应用
- 需要确保数据回滚的场景
- 事务完整性重要的金融应用
- 低并发负载的环境

WAL 模式的优缺点:

  • 优点

    • 高并发性:
      • WAL 模式允许多个读操作并行执行,而不必等待写操作完成。这对读多写少的应用程序非常有利。
    • 写入性能:
      • 由于写操作是先写入 WAL 文件而不是直接更改数据库,写操作的性能通常优于传统的日志模式,尤其是在进行大量插入时。
    • 避免写阻塞:
      • 在 WAL 模式下,写操作不会阻塞读取操作。只有在强制检查点(checkpoint)过程中,才会进行某种程度的阻塞。
    • 崩溃恢复能力:
      • WAL 文件在发生崩溃时可以帮助恢复未提交的事务。WAL 模式允许在发生故障后更加稳健地恢复数据库状态。
    • 逐步更新:
      • WAL 文件支持逐步刷新到主数据库文件,这样可以避免在每次写入时立即更新主数据库,减少了大量 I/O 操作。
  • 缺点

    • 存储空间:
      • WAL 文件可能变得很大,尤其是在频繁写入的场景中。需要定期执行 CHECKPOINT 操作以清理 WAL 文件,从而释放存储空间。
    • 检查点管理:
      • 有时需要手动管理 CHECKPOINT 操作来将 WAL 文件中的数据写入主数据库,这增加了管理复杂性。如果不定期进行 CHECKPOINT,可能导致 WAL 文件无限增大。
    • 写操作延迟:
      • 初始写操作会写入 WAL 文件,在强制将数据从 WAL 刷新到主数据库之前,可能会有一定延迟。这对某些特定场景(例如实时系统)可能不利。
    • 持久性配置需求:
      • 在某些情况下(特别是嵌入式系统),WAL 模式可能需要更多的内存和存储资源来管理 WAL 文件和进行 CHECKPOINT。
    • 旧版本支持:
      • WAL 模式可能不被所有 SQLite 版本支持,使用时需要确保兼容性。

回滚模式优缺点

  • 优点
    • 数据完整性:
      • 回滚日志确保了数据的一致性和完整性,即使在事务异常中断或发生崩溃的情况下,可以通过回滚日志恢复到事务开始之前的状态。
    • 简单的故障恢复:
      • 如果发生错误或系统崩溃,可以通过日志文件回滚未完成的事务,减少数据损失的风险。
    • 自动管理:
      • 当事务结束时,日志文件可以自动清理,不需要手动管理(例如 CHECKPOINT 操作)。
    • 易于实现:
      • 对于一些简单的应用,Rollback Journal 模式的设置和使用相对简单,因为它不会涉及复杂的参数配置或管理。
    • 低内存需求:
      • 与 WAL 模式相比,Rollback Journal 模式通常对内存的需求较低,因为它的工作方式不需要持有大量的日志文件。
  • 缺点
    • 性能开销:
      • 在执行写操作时,Rollback Journal 模式需要创建和写入日志文件,可能会导致性能下降,特别是在频繁写入的状况下。
    • 读操作阻塞:
      • 在执行写操作时,读操作通常会被阻塞,直到写入完成。这可能影响多用户环境下的并发性。
    • 写延迟:
      • 对于每个事务,数据库在应用实际更改之前都必须首先写入回滚日志,这会引入额外的延迟。
    • 日志文件管理:
      • 虽然不需要手动进行 CHECKPOINT 操作,但仍需要管理日志文件的大小和数量,特别是在大事务完成后,及时清理日志很重要。
    • 不适合高并发应用:
      • 在高并发读写的场合,Rollback Journal 模式可能导致性能瓶颈,因为写入会严重影响读取性能。

你可能感兴趣的:(sqlite,数据库,c++)