ACID有多少营销?

大家好。联系弗拉迪斯拉夫·罗丹(Vladislav Rodin)。我目前是OTUS高负载架构师课程的负责人,并且还教授软件架构课程。

正如您所看到的,除了教学,我还一直在写博客版权材料OTUSHabré,今天的文章我想与“数据库”课程的开始相吻合,该课程现已开放。




前言


交易出现在20世纪70年代,并作为一种数据库工具提供,用于解决竞争环境中的容错和数据访问问题。然后,制定了交易必须具备的一些属性才能完成分配给它的任务,并且按正确顺序设置的这些属性的大写字母组成了漂亮的缩写ACID。

这些事件发生的时间段的特点是没有高负载,Internet和性能问题,这些问题只能通过垂直扩展方法来解决。随后,在2000年代初,NoSQL数据库出现了一种趋势,出现了BASE缩写,实际上与经典的ACID(ACID-酸,BASE-碱)相对。现在,ACID有相反的趋势。甚至NoSQL的MongoDB现在也支持ACID。

让我们看一下这个缩写的含义以及它的营销量。

ACID表示4个属性:

A =原子性
C =稠度
I =隔离度
D =持久性

现在让我们分别讨论每个属性。

A =原子度


原子性是一个重载的术语,在数据库事务中,可以将其表述为“全有或全无”的原则。如果您的事务包含10个插入操作,则将执行所有10个操作(将执行提交事务),或不执行任何操作(将执行回滚事务)。

如何提供此属性?事实是,当包含相同10个插入的事务进入数据库时​​,数据不会开始更改。在进行事务处理之前,将事务处理直接写入日志中的数据,并记录其所做的更改。该日记帐也可以用来复制数据,也可以与之完全无关,例如我在此处所述。由于有了此日志,可以将事务直接提交给数据,或者在这种情况下可以回滚。尽快关闭事务的规则直接是基于对实现此属性的原理的理解:通常禁止在事务打开时清理该日志的数据库,这样它可能会被阻塞,从而导致非常不愉快的后果。

C =一致性(一致性或完整性)


就ACID而言,一致性并不等同于CAP定理(在分布式系统理论中,这种一致性有很多程度)。通过一致性,我们的意思是:必须在提交事务之前和之后执行系统的一些预定义不变式。可以表示系统不变量的示例:借方与贷款一致,员工的总薪金不超过预算,公司的员工人数等于以前打开的空缺人数,等等。在数据库语言中,这意味着仅满足所有约束条件。

在数据库级别上是否需要一致性的问题引起了很大争议,因为约束的存在可以表明部分业务逻辑已从应用程序迁移到数据库级别,而这并不是普遍公认的良好做法。最后,应用程序本身可能决定不提交无效数据。有一种观点认为,添加一致性只是为了使缩写漂亮(行销)。

I =隔离


隔离是一种数据库属性,它允许并行事务按顺序执行。毕竟,没有人禁止数据库同时执行多个事务,因此必须确保它们不会互相影响,以免发生竞争条件类型的异常。实际上,隔离解决了竞争环境中数据访问的问题。

由于隔离的概念量大,因此公开的内容值得一提,因为正是隔离可以称为ACID的心脏。事务性的代价通常归结为确保隔离的代价,这就是隔离具有不同级别的原因,每个级别都提供自己的级别以防止竞争条件并承担一个或另一个开销。仅在可序列化级别上完全确保隔离,这很难实现并且很少需要。

D =耐久性


持久性告诉我们,如果已应用事务,则决不应消失。实际上,这意味着:如果数据库响应已提交事务,则该事务已提交到非易失性内存。这意味着发生了fsync系统调用,即,缓冲区已刷新到硬盘驱动器,并且它回答正常。

耐久性也是市场术语,因为它不能完全提供。即使我们抛弃了“被外星人烧地球”的人为场景,此后将根本没有数据库或交易,更不可能但有极端的物理场景,即记录有交易的特定硬盘发生物理破坏,我们可以回想起fsync系统调用保证击中控制器中的硬盘驱动器,该硬盘驱动器继而仍然包含易失性缓冲区。花费的时间很短,但不等于0。因此,如果您恰好在“正确的”时刻关闭电源,交易可能仍然会丢失!

尽管在昂贵的Oracle数据库中已经解决了fsync的问题,但是没有什么可以使我们免受与计算机物理破坏有关的问题的困扰。我们只能使用备份和复制来增加保证

发现


尽管ACID提供了非常有趣的属性(例如原子性和隔离性),但是其中一些属性仅是市场营销,甚至比BASE更为严格,ACID仍无法完全确保没有交易损失的机会以及结果的影响彼此同时执行事务(必须仍然配置隔离!)。


我们邀请所有人参加有关该主题免费课程“在PostgreSQL中处理数据的模型



All Articles