数据库一致性由一组值定义,数据库系统内的所有数据点必须对齐才能正确读取和接受。如果任何不符合预处理值的数据进入数据库,将导致数据集的一致性错误。数据库一致性是通过建立规则来实现的。写入数据库的任何数据事务只能更改由特定约束、触发器、变量、级联等定义的受影响数据,这些数据由数据库开发人员设置的规则建立。
例如,假设您在国家交通安全研究所 (NTSI) 工作。您的任务是创建一个包含新加州驾驶证的数据库。在过去的十年中,加利福尼亚的人口爆炸式增长,为所有首次获得驾驶执照的人创造了一种新的字母和数字格式的需求。您的团队已确定数据库中加州驾驶证的新设定值如下:1 Alpha + 7 Numeric。现在每个条目都必须遵循此规则。读取“C08846024”的条目将返回错误。为什么?因为输入的值是 1 Alpha + 8 Numeric,本质上是一种数据不一致的形式。
一致性还意味着对一个表中任何一个特定对象的任何数据更改都需要在该对象存在的所有其他表中进行更改。继续驾驶执照示例,如果新驾驶员的家庭地址发生变化,则必须在存在该先前地址的所有表中表示该更新。如果一个表有旧地址而所有其他表都有新地址,那将是数据不一致的主要例子。
注意:数据库一致性并不能保证任何给定事务中引入的数据是正确的。它只保证在系统内写入和读取的数据满足数据进入数据库的所有先决条件。简单来说,给定上面的例子,你可以很好地输入符合 1 Alpha + 7 Numeric 规则的数据交易,但这并不能保证数据对应于实际的驾驶执照。数据库一致性不考虑数据代表什么,只考虑它的格式。
为什么数据库一致性很重要?
一致的数据使数据库能够像运转良好的机器一样工作。已建立的规则/值可将不一致的数据排除在主数据库和副本之外,从而使其操作顺利进行:
- 准确性
- 增加数据库空间
- 更快、更高效的数据检索
数据库一致性规范了所有传入的数据。因此,尽管数据库在接受新数据时会发生变化,但它至少会始终如一地发生变化,并且符合一开始就建立的验证规则。在当今世界,全球每天都有数十亿美元的决策基于数据库的感知一致性。当实时信息成为现代数字业务的新现状时,制定验证规则以使数据集远离错误信息至关重要,因为这也会增加延迟,使实时体验变得不那么真实-毕竟时间。
数据库一致性示例
现实世界中数据库一致性操作的例子有哪些?我们已经在上面的 NTSI 场景中探索了一个示例。让我们转向银行业。
假设您将资金从一个帐户转移到另一个帐户。您刚刚将 1200 美元转入一个已有 300 美元的账户。你刷新,肯定你会发现 1500 美元的余额。然而,最近的这一操作并未反映在您的余额中。事实上,您的新余额现在显示为 0 美元。这种技术上的轻微问题是一致性弱的一个典型例子,可能会导致花时间与银行代表一起解决问题。诸如此类的问题会损害品牌的声誉并花费大量金钱。对于开发人员和消费者来说,数据库系统中的强一致性正变得越来越不可协商。
强一致性 vs 弱一致性
强一致性意味着主节点、副本及其所有对应节点中的所有数据都符合验证规则,并且在任何给定时间都是相同的。凭借强大的数据库一致性,无论什么客户端访问数据都无关紧要——他们将始终看到遵循为数据库建立的规则的最新更新数据。
弱一致性有点像众所周知的狂野西部。无法保证您在主节点、副本或节点中的数据在任何给定时刻都是相同的。印度的一位客户可以访问数据并查看通过验证规则的信息,但可能不是最近更新的数据,从而导致一致性错误。他们很可能会根据不再相关的信息采取行动,即使在某一时刻它可能是。
由于我们的主动-主动地理分布技术,Redis Enterprise 拥有强大的最终一致性。
一致性级别
一致性级别是另一组预先确定的值,它指示在确认为有效事务之前,必须有多少副本或节点响应新的允许数据。此操作可以在每个事务的基础上进行更改。因此,例如,程序员可以规定只有两个节点需要在确认数据一致性之前读取新输入的数据。一旦超过该晴雨表,此后将被视为一致的数据。
隔离级别
隔离级别是数据库的 ACID(原子性、一致性、隔离性、持久性)属性的一部分。ACID 是数据库与 SQL 数据库一致性的基本概念,并且是某些数据库为了优化数据库一致性而遵循的。隔离是 ACID 的属性之一,它将某些数据与某个数据库网络中的所有信息分开,防止它被其他用户事务修改。隔离被用来减少并发事务中产生的无关数据的读取和写入。
有四种类型的隔离级别:
-
读未提交:最低级别。如果先前的事务为该行提 供未提交的更新,则停止行更新。
-
Read Committed:这不允许“脏读”。如果事务已更新但尚未提交,这将阻止任何读取或写入。
-
可重复读取:此级别防止正在读取的数据行被访问和可能更新。
-
Serializable:最高隔离级别,可序列化通常锁定整个表而不是特定的数据行。
数据库一致性常见问题解答
Q1:如果数据一致,这意味着什么?
如果数据在所有相应节点中同时显示相同,则数据是一致的,无论用户和他们在哪里访问数据,地理上。
Q2:数据一致性和数据库一致性一样吗?
不。数据库一致性需要对进入网络的数据进行验证规则,以使其在公式方面与表中的所有其他数据保持一致。
数据一致性是在整个网络中以及在利用该数据的众多应用程序之间尽可能统一地保存数据的过程。
Q3:什么是最终一致性?
通过最终一致性,经过更新的数据最终将反映在存储该数据的所有节点中。最终,只要任何客户端通过最终一致性在网络中访问它,所有节点都会产生相同的数据。
Q4:关系数据库中的单个表由什么组成?
关系数据库中的所有数据都存储在表中,表由行和列组成。数据点按这些行和列组织。通常被称为“记录”的行通常代表数据的类别,而列或“字段”则代表“实例”。可以在数据库中找到一个表,并通过其基于主题的设计帮助防止您的数据变得多余。
Q5:一个关系数据库由一个集合组成?
表。
Q6:ACID 模型与 BASE 模型相比如何?
ACID 和 BASE(基本可用、软状态、最终一致)模型之间的主要区别在于,虽然 ACID 致力于优化数据库一致性,但 BASE 增强了高可用性。ACID 使事务保持一致,因此如果您使用 BASE 模型,请确保一致性仍然是重中之重并得到彻底解决。
Q7:Redis 数据库是否一致?
当 Redis 用作缓存时,有问题的一致性可能在 Redis 实例(主/副本)之间以及 Redis 缓存和 Redis 作为主数据库之间。在这种情况下,如果这两者之间的数据不匹配,则数据可能会不一致。我们的博客,《维护缓存一致性的三种方法》,讨论了如何解决这个问题,感兴趣可以看看。
对于开源 Redis,存在弱一致性,但 Redis Enterprise 的 Active- Active Geo-Distribution 拥有强的最终一致性。
对企业应用程序的云缓存技术感兴趣?点击下方阅读 Lee Atchison 的_使用 Redis 进行大规模缓存_。
点击阅读电子书
原文标题:What is database consistency?
原文作者:John Noonan
原文地址:https://redis.com/blog/database-consistency/