我已经研究了很多如何在数据库中实现持久性,如果我理解得很好,它的工作原理是这样的(简化的):
克伦特观点:
- 开始交易。
- 插入表值...
- 提交事务
DB引擎观点:
- 将事务开始指示器写入日志文件
- 将客户端所做的更改写入日志文件
- 将事务提交指示符写入日志文件
- 将日志文件刷新到 HDD(这确保了数据的持久性)
- 向客户端返回“OK”
我观察到的:
客户端应用程序是单线程应用程序(一个数据库连接)。我能够执行 400 个事务/秒,而将某些内容写入文件然后将此文件 fsync 到 HDD 的简单测试仅执行 150 个同步/秒。如果客户端是多线程/多连接,我会想象数据库引擎对事务进行分组并每几笔事务执行一次 fsync,但事实并非如此。
我的问题是,例如,MsSQL 是否真的在每次事务提交时同步日志文件(fsync、FlushFileBuffers 等),还是背后有其他某种魔法?