2

ACID 中的“D”表示“持久性”,维基百科将其定义为:“每个提交的事务都受到保护,免受断电/崩溃/错误的影响,并且不会被系统丢失,因此可以保证完成”。

但是,这意味着在报告成功之前,每个事务都必须同步到磁盘,而不仅仅是刷新。('flush'=发送到操作系统级别,'sync'=发送到物理磁盘盘片)。这将使得不可能实现高事务率的 RDBMS。

流行的 RDBMS 真的会同步每笔交易吗?

4

3 回答 3

3

使用磁盘进行持久性的数据库确实必须写入磁盘以使事务持久。此外,它们还必须同步到磁盘以避免写回缓存的任何损失。

为了实现高性能,数据库将使用组提交,即在一个提交周期中的多个事务将使用相同的写入/同步操作来使所有事务持久。这在它们都附加到同一个事务日志的情况下是可能的。

这可能意味着单个提交的响应可能会延迟(在等待其他人加入提交周期时),但整个数据库的整体吞吐量要大得多,因为写入/同步的成本在多个事务中分摊。例如,每个单独的事务可能需要 10 毫秒,但数千个事务都能够在同一个周期内提交。

数据库测量有多少事务处于活动状态以判断是否值得让任何单个事务等待其他事务加入提交周期是正常的,这样在负载非常轻的系统上,事务不需要等待其他事务。

并非所有数据库都使用磁盘来保证持久性。例如,VoltDB 依赖于跨多个服务器保存在内存中的事务副本。如果其中一台服务器死机,该事务在其他地方仍然可用。因此,交易只需要确保交易已被传输到足够多的服务器以确保持久性。

这也提出了什么是耐用的问题?单盘耐用吗?如果磁盘发生故障,则不会。RAID 阵列是否耐用?如果发生灾难性的 RAID 损坏,则不会。持久性的唯一保证是在多个远程数据库实例之间复制事务 - 但并不是每个人都需要这种级别的保证。耐久性不应被视为二元选项,而应被视为耐久性水平的选择。

于 2011-10-27T08:46:50.820 回答
1

“磁盘”不仅仅是一个文件。提交将写入事务日志,然后用于更新数据库。如果系统在更新之前崩溃,可以从日志中重建事务。

于 2011-10-26T01:06:58.580 回答
0

是的——它被称为回滚日志。

为什么你认为这是不可能的?

而且,如果你说没有同步每笔交易,你建议如何解决这个问题?

于 2011-10-26T01:07:35.293 回答