数据库持久性与性能

时间:2011-03-26 11:35:42

标签: database internals acid durability

我已经研究了如何在数据库中实现持久性,如果我理解的话,它就像这样(简化):

克莱恩的观点:

  1. 开始交易。
  2. 插入表值...
  3. 提交交易
  4. 数据库引擎的观点:

    1. 将事务开始指示符写入日志文件
    2. 将客户端完成的更改写入日志文件
    3. 将事务提交指示符写入日志文件
    4. 将日志文件刷新到HDD(这可确保数据的持久性)
    5. 向客户
    6. 返回'确定'

      我观察到了什么:

      客户端应用程序是单线程应用程序(一个数据库连接)。我能够执行400个事务/秒,而将某些内容写入文件然后将此文件同步到HDD的简单测试仅执行150个同步/秒。如果客户端是多线程/多连接,我会想象数据库引擎将事务分组,并且每几次事务执行一次fsync,但事实并非如此。

      我的问题是,例如MsSQL,是否真的在每次交易提交时同步日志文件(fsync,FlushFileBuffers等等),还是其他一些魔法?

1 个答案:

答案 0 :(得分:0)

简短的回答是,对于要持久的事务,必须在将对数据库的更改写入磁盘之前将日志文件写入稳定存储。

稳定存储比您想象的更复杂。例如,磁盘通常不被认为是稳定存储。 (无论如何,不​​是为事务数据库引擎编写代码的人。)

它看到特定的开源dbms如何写入稳定存储,您需要阅读源代码。 PostgreSQL源代码是online。 (文件是xlog.c)不知道MySQL源代码。