macOS 上的 SQLite:与捆绑版本不兼容(不符合 ACID 标准)

主要观点:作者构建数据库并以 SQLite 为标准对比,发现苹果捆绑的 SQLite 版本不符合 ACID 规范,默认使用fsync()同步,而非F_BARRIERFSYNC。介绍了fsync()fcntl()在不同系统的情况,以及F_FULLFSYNCF_BARRIERFSYNC的作用和区别。通过测试发现苹果的 SQLite 不会默认使用F_BARRIERFSYNC,而是在启用PRAGMA fullfsync时用fcntl(.., F_BARRIERFSYNC,..)替换fcntl(.., F_FULLFSYNC,..)
关键信息

  • 作者构建数据库并对比 SQLite。
  • 苹果捆绑 SQLite 版本不符合 ACID 规范。
  • fsync()fcntl()的系统差异及作用。
  • 测试发现苹果 SQLite 的同步行为。
    重要细节
  • 2022 年 2 月 Scott Perry 提及F_BARRIERFSYNC,有人误解其为默认行为。
  • macOS 中fsync()的说明及F_FULLFSYNC的作用。
  • 作者创建基准测试比较 Sediment 和 SQLite 在不同系统的性能。
  • 通过 dtrace 追踪系统调用验证 SQLite 的同步行为。
  • 讨论F_BARRIERFSYNC对不同应用的重要性及苹果决策的原因。
  • 未在 iOS 上测试且怀疑苹果未维护单独版本 SQLite 且其为闭源。
  • 鼓励苹果公开 SQLite 更新。
阅读 13
0 条评论