ACID中的“D”表示“持久性”,由维基百科定义为:“每个已提交的事务都受到保护,免受电源丢失/崩溃/错误的影响,并且不会被系统丢失,因此可以保证完成”。
但是,这意味着每个事务必须先同步到磁盘才能报告为成功,而不仅仅是刷新。 ('flush'=发送到操作系统级别,'sync'=发送到物理磁盘盘片)。这将导致无法实现高事务率RDBMS。
流行的RDBMS真的会同步每笔交易吗?
答案 0 :(得分:3)
使用磁盘进行持久化的数据库确实必须写入磁盘以使事务持久。此外,它们还必须同步到磁盘以避免写回缓存的任何损失。
为了实现高性能,数据库将使用组提交,其中提交周期中的多个事务将使用相同的写/同步操作来使所有事务持久。这些都可以附加到同一个事务日志中。
这可能意味着单个提交的响应可能会延迟(等待其他人加入提交周期)但整个数据库的整体吞吐量要大得多,因为写入/同步的成本在多个中分摊交易。例如,每个单独的事务可能需要10mS,但是数千个事务都能够在同一个周期中提交。
数据库测量有多少事务是正常的,以判断是否值得使任何单个事务等待其他人加入提交周期,这样在一个负载很轻的系统上,事务不需要等待其他事务
并非所有数据库都使用磁盘来保证持久性。例如,VoltDB依赖于跨多个服务器在内存中保存的事务的副本。如果其中一个服务器死机,该交易仍可在其他地方使用。因此,事务只需要确保将事务传输到足够的服务器群以确保持久性。
这也提出了什么是耐用的问题?单个磁盘是否耐用?如果磁盘发生故障则不行。 RAID阵列是否耐用?如果存在灾难性的RAID损坏,请勿使用。持久性的唯一保证是跨多个远程数据库实例复制事务 - 但并非每个人都需要这种级别的保证。耐久性不应被视为二元期权,而应视为耐久性水平的选择。
答案 1 :(得分:1)
'磁盘'不只是一个文件。提交将写入transaction log,然后将用于更新数据库。如果系统在更新之前崩溃,则可以从日志中重建事务。
答案 2 :(得分:0)
是的 - 它被称为回滚日志。
为什么你认为这是不可能的?
而且,如果你说每次交易的同步都没有发生,你建议解决这个问题的方法是什么?