在讨论数据库时,你可能会听到最常见的疑问是询问它是否遵循ACID原则。但什么是ACID呢?ACID代表原子性、一致性、隔离性和持久性。它描述了一系列期望,确保任何数据库事务都能以可靠的方式处理,从而保证正确性。当数据库满足这些期望或原则时,它被认为是ACID合规的。
在本篇文章中,你将了解ACID的含义,更详细地分解其四个要素,以及为什么它如此重要。
目录
在本节中,我们将更深入地探讨ACID的四个要素,以及它们在确保数据事务可靠性方面所起的作用。
原子性围绕着整体性的理念。在执行任何类型的数据库事务时,它通常由多个操作组成。具有原子性意味着所有操作要么全部成功,要么全部失败。这很重要,因为操作可能会相互影响,所以一个失败可能导致意想不到的结果。
例如,考虑一笔金融交易。你可能需要支付250美元给一个假期。整个交易将包括资金从你的账户离开并到达收款人的账户。如果没有原子性,资金可能离开你的账户但未能到达另一端,导致你被扣款但仍然欠收款人钱。
一致性是确保作为事务一部分所做的更改与任何数据库约束一致。
除非你有约定的透支,否则例如银行会期望你的余额为正数。所以如果你试图取出比你可用的更多的钱,这将违反约束并失败,回滚该事务中的所有操作。
隔离性是为了确保所有事务都在隔离的环境中运行,互不干扰。
继续以金融为例,假设您的银行余额为200美元,您在ATM上尝试取出100美元。与此同时,您设置的一个自动扣款订单也扣除了100美元。在隔离机制下,这些交易可以同时发生,确保您的最终余额为0美元,而不是100美元,因为这些交易互相影响。
持久性是ACID的另一个重要元素,因为它确保无论发生什么情况,一旦交易完成,该交易的变化就会被写入数据库。这确保了数据更改被持久化,即使在电源故障或系统崩溃的情况下也是如此。
如上所述,ACID关乎确保在运行一组操作(即交易)之后,数据将处于预期的、一致的状态。因此,遵守ACID元素的交易被称为ACID交易。
ACID已经是许多关系型数据库提供了一段时间的东西。这意味着当决定是否迁移到NoSQL解决方案时,人们通常会问,“NoSQL数据库可以是ACID兼容的吗?”好吧,答案很简单:绝对可以!并非每个NoSQL数据库都是ACID兼容的,但许多是。事实上,MongoDB是一个ACID兼容的数据库。截至MongoDB 4.0,甚至在需要时支持多文档ACID交易。版本4.2甚至带来了分布式多文档ACID交易,提供了更多的灵活性。
然而,MongoDB的最佳数据建模实践建议使用各种数据类型(包括数组和内嵌文档)将相关数据存储在单个文档中。因此,很多时候,由于它是单一文档交易,ACID不是必需的。
您有时还会听到另一个术语BASE,它是代表基本上可用、软状态、最终一致性的缩写。在BASE中,可用性被置于一致性之上。这最初是为无法遵守ACID兼容性的NoSQL数据库开发的。但这不再是事实,ACID绝对是人们最希望的。例如,MongoDB不能遵守BASE,因为按照BASE规则,交易是一致的,而不是最终一致的。
在这篇文章中,您了解了一些关于ACID是什么、为什么它很重要以及MongoDB如何完全遵守ACID的知识。您还了解到ACID交易是数据库的核心部分,MongoDB能够通过多文档和分布式多文档交易来实现这一点。
今天开始使用MongoDB Atlas,享受丰富的文档数据模型和ACID兼容的特性。
是的!MongoDB完全符合ACID交易。利用文档数据模型并将相关数据存储在一起,可以消除对交易的需求。但如果需要,MongoDB支持多文档和分布式多文档ACID交易。
ACID代表原子性、一致性、隔离性和持久性,它是一套关于如何处理数据交易的原理,允许具有高可靠性和正确性。如果交易中的任何操作无法完成,交易将失败,并回滚更改。
尽管不是强制性的,但建议使用MongoDB之类的ACID兼容数据库,因为它可以确保您的数据库中的数据是正确的,并且没有受到任何其他交易或意外系统问题的影响。