ACID: 在计算机科学中,ACID是数据库事务的一组特性,旨在保证数据的有效性,即使在出现错误、断电和其他意外情况下也能保持数据的一致性。在数据库的上下文中,满足ACID属性的一系列数据库操作(可以被视为对数据的单一逻辑操作)称为“事务”。例如,从一个银行账户向另一个账户转账,即使涉及多个更改(比如从一个账户借记并向另一个账户贷记),也视为单一事务。
CAP:在理论计算机科学中,CAP定理(也称为Brewer定理,以计算机科学家Eric Brewer命名)规定任何分布式数据存储只能提供三个特性中的两个(一致性、可用性、分区容错性)。
概要
•ACID处理个体节点的数据一致性 = 事务级别•CAP处理整个集群的数据一致性 = 节点级别
ACID:
•原子性(Atomicity):
原子事务是一系列数据库操作的不可分割和不可约简,要么全部发生,要么全部不发生。
一个原子事务的例子是从账户A向账户B进行货币转账。它包括两个操作:从账户A取款和存入到账户B。通过在原子事务中执行这些操作,确保数据库保持在一致的状态,即如果这两个操作中的任何一个失败,资金既不会丢失也不会被创建。
•一致性(Consistency):
所有已应用的数据更改为所有数据库连接提供一致的数据视图。也就是说,在成功写入、更新或删除记录之后,任何读取请求都会立即接收到记录的最新值。
一致性(或正确性)指的是任何给定的数据库事务必须仅按照允许的方式更改受影响的数据。写入数据库的任何数据必须符合所有定义的规则,包括约束、级联、触发器以及所有这些规则的组合。
•隔离性(Isolation):
隔离性确定事务完整性对其他用户和系统的可见性。隔离性通常在数据库级别定义,是一个属性,定义了一个操作的更改在何时或如何成为对其他操作可见。
较低的隔离级别增加了许多用户同时访问相同数据的能力,但增加了用户可能遇到的并发效果(如脏读取或丢失更新)的数量。相反,较高的隔离级别减少了用户可能遇到的并发效果,但需要更多的系统资源,并增加了一个事务将阻塞另一个事务的机会。
二阶段锁定是数据库管理系统中最常见的事务并发控制方法,用于提供正确性的序列化和可恢复性。为了访问数据库对象,事务首先需要为该对象获取锁定。根据访问操作类型(例如读取或写入对象)和锁类型,如果另一个事务持有该对象的锁定,则获取锁定可能会被阻塞和延迟。
•持久性(Durability):
持久性是ACID属性,保证已提交的事务将永久保存。例如,如果航班预订报告表示已成功预订座位,则即使系统崩溃,座位也将保留预订状态。
持久性可以通过将事务的日志记录刷新到非易失性存储中来实现,然后在确认提交之前。
在分布式事务中,所有参与的服务器必须在确认提交之前进行协调。这通常通过二阶段提交协议来完成。
许多数据库管理系统通过将事务写入事务日志来实现持久性,可以重新处理事务日志以在任何后续故障之前重新创建系统状态。只有在事务记录输入日志后,事务被视为已提交。
CAP
•一致性(Consistency)(所有节点通过最终一致性拥有相同的数据):一致性意味着在一个节点上的更新/更改立即传播到其他节点。•可用性(Availability):每个请求都会收到(非错误的)响应,但不能保证它包含最新的写入。例如,我们需要跟踪和报告国家的公民数量,如果在计算中丢失了最新数据,不会对最终结果造成重大错误。我们可以使用支持可用性的数据存储。另一方面,当我们需要跟踪业务交易时,我们需要选择支持一致性的数据存储。•分区容错性(Partition Tolerance):即使发生节点之间的任意消息丢失(或延迟),系统仍然可以继续运行。
当发生网络分区故障时,必须决定采取以下其中一种操作:
•取消操作,从而降低可用性但确保一致性•继续操作,从而提供可用性但可能导致不一致性。
CAP定理的维恩图
因此,如果存在网络分区,则必须在一致性和可用性之间选择。
作为CAP权衡
CAP定理基于三个权衡,其中之一是“原子一致性”(缩写为“一致性”),“讨论原子一致性与讨论ACID数据库有些不同,因为数据库一致性是指事务,而原子一致性仅指单个请求/响应操作序列的属性”。
注意:尽管一些人偏向一致性,而其他人偏向可用性,但其他NoSQL数据存储(如Cassandra和DynamoDB)可以同时提供两者。