2011-10-26 27 views
1

ACID中的'D'表示维基百科定义的“耐久性”:“每一笔交易都受到保护,以防止电力损失/死机/错误,并且系统不会丢失,因此可以保证完成”。典型的ACID RDBMS是否每次提交都同步到磁盘?

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

做流行的RDBMS是否真的同步每一笔交易?

回答

3

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

为了实现高性能,数据库将使用组提交,因此提交循环中的多个事务将使用相同的写入/同步操作来使所有事务都持久。这是可能的,他们都附加到相同的事务日志。

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

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

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

这也提出了什么是耐用的问题?单个磁盘是否持久?不是如果磁盘失败。 RAID阵列是否持久?如果存在灾难性的RAID损坏,则不行。持久性的唯一保证是在多个远程数据库实例中复制事务的地方 - 但并非每个人都需要这种保证。耐用性不应被视为二元期权,而应视为耐久性水平的选择。

1

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

+0

提交需要同步事务日志,而不是刷新它。即使您设法避免磁盘磁头移动,操作系统也需要对磁盘控制器进行大量对话,以获取通常为非常少量数据的信息。 –

+0

你的问题是“是否流行的RDBMS真的同步每一笔交易?”答案是“是的,如果数据库管理系统说它已经提交,它已经提交。“ – Dave

0

是 - 它被称为回退日志。

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

而且,如果您说每个事务都没有同步,那么您提出什么解决方案?

+0

我认为这是不可能的,因为在大多数同步操作中很难避免磁盘移动或其他与磁盘相关的开销,并且这会将每秒的事务数减少到100或1000,而不是10,000。我没有解决方案。 –

相关问题