2

我已经研究了很多如何在数据库中实现持久性,如果我理解得很好,它的工作原理是这样的(简化的):

克伦特观点:

  1. 开始交易。
  2. 插入表值...
  3. 提交事务

DB引擎观点:

  1. 将事务开始指示器写入日志文件
  2. 将客户端所做的更改写入日志文件
  3. 将事务提交指示符写入日志文件
  4. 将日志文件刷新到 HDD(这确保了数据的持久性)
  5. 向客户端返回“OK”

我观察到的:

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

我的问题是,例如,MsSQL 是否真的在每次事务提交时同步日志文件(fsync、FlushFileBuffers 等),还是背后有其他某种魔法?

4

1 回答 1

0

简短的回答是,要使事务持久,必须先将日志文件写入稳定存储,然后再将数据库的更改写入磁盘。

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

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

于 2011-03-26T12:23:50.357 回答