我已经研究了如何在数据库中实现持久性,如果我理解的话,它就像这样(简化):
克莱恩的观点:
数据库引擎的观点:
我观察到了什么:
客户端应用程序是单线程应用程序(一个数据库连接)。我能够执行400个事务/秒,而将某些内容写入文件然后将此文件同步到HDD的简单测试仅执行150个同步/秒。如果客户端是多线程/多连接,我会想象数据库引擎将事务分组,并且每几次事务执行一次fsync,但事实并非如此。
我的问题是,例如MsSQL,是否真的在每次交易提交时同步日志文件(fsync,FlushFileBuffers等等),还是其他一些魔法?
答案 0 :(得分:0)
简短的回答是,对于要持久的事务,必须在将对数据库的更改写入磁盘之前将日志文件写入稳定存储。
稳定存储比您想象的更复杂。例如,磁盘通常不被认为是稳定存储。 (无论如何,不是为事务数据库引擎编写代码的人。)
它看到特定的开源dbms如何写入稳定存储,您需要阅读源代码。 PostgreSQL源代码是online。 (文件是xlog.c)不知道MySQL源代码。