ACID 中的“D”表示“持久性”,维基百科将其定义为:“每个提交的事务都受到保护,不会发生断电/崩溃/错误,并且不会被系统丢失,因此可以保证完成”。
但是,这意味着每个事务在报告为成功之前都必须同步到磁盘,而不仅仅是刷新。 ('flush'=发送到操作系统级别,'sync'=发送到物理磁盘盘片)。这将导致无法实现高事务率的 RDBMS。
流行的 RDBMS 真的会同步每个事务吗?
最佳答案
使用磁盘进行持久化的数据库确实必须写入磁盘以使事务持久化。此外,它们还必须同步到磁盘以避免写回缓存造成任何损失。
为了实现高性能,数据库将使用组提交,其中一个提交周期中的多个事务将使用相同的写入/同步操作以使所有事务持久化。如果它们都附加到同一事务日志,则这是可能的。
这可能意味着单个提交的响应可能会延迟(同时等待其他人加入提交周期),但整个数据库的总体吞吐量要大得多,因为写入/同步的成本分摊到多个交易。例如,每个单独的事务可能需要 10 毫秒,但数千个事务都能够在同一周期内提交。
数据库通常会测量有多少事务处于事件状态,以判断是否值得让任何单个事务等待其他事务加入提交周期,这样在负载非常轻的系统上,事务就不需要等待其他事务.
并非所有数据库都使用磁盘来保证持久性。例如,VoltDB 依赖于多个服务器内存中保存的事务副本。如果其中一台服务器挂掉,交易在其他地方仍然可用。因此,一笔交易只需要确保交易已被传输到足够多的服务器上即可保证持久性。
这也提出了一个问题:什么是持久的?单盘耐用吗?如果磁盘出现故障则不会。 RAID 阵列耐用吗?如果发生灾难性的 RAID 损坏,则不会。持久性的唯一保证是跨多个远程数据库实例复制事务 - 但并非每个人都需要这种级别的保证。耐久性不应被视为二元选项,而应被视为耐久性级别的选择。
关于rdbms - 典型的 ACID RDBMS 每次提交都会同步到磁盘吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7897628/