SQLite's Durability Settings Are a Mess
9 months ago
- #Database
- #Durability
- #SQLite
- SQLite的持久性设置令人困惑且文档记录不足。
- 数据库中的持久性确保已提交的事务即使在崩溃或断电后也不会丢失。
- SQLite提供如`journal_mode`和`synchronous`等配置选项来控制持久性。
- 默认`journal_mode`为DELETE,默认`synchronous`为FULL,但在DELETE模式下FULL并不能保证持久性。
- 若要在DELETE模式下实现持久性,必须将`synchronous`设置为EXTRA。
- 在WAL模式下,`synchronous=FULL`可提供持久性,但文档与开发者的说法存在矛盾。
- 封装SQLite的库可能覆盖默认设置,例如某些Go驱动在WAL模式下设为`synchronous=NORMAL`,这会丧失持久性。
- macOS的`fsync`默认不可靠;SQLite需启用`fullfsync`才能确保正确持久性。
- 由于默认设置不明确且可能存在破坏性变更,程序员必须显式配置持久性设置。
- SQLite应改进文档,明确列出每种`journal_mode`与`synchronous`组合对应的持久性保证。