事务的“一致性”究竟指的是什么?
保留所有版权,请引用而不是转载本文(原文地址 https://yeecode.top/blog/110/ )。
众多的“一致性”
说到一致性,大家都不陌生。随着分布式系统、微服务系统、区块链等技术的发展,“一致性”一词出现的频率也越来越高。
然而,“一致性”这一词语所代表的概念却并不唯一。例如我们常听到“事务的一致性”、“最终一致性”、“一致性哈希”等,它们表述的并不是同一个概念。理解这点十分重要。如果错误地认为以上几个“一致性”都指同一个概念,那就搞混了。
在明确以上概念各不相同的基础上,我们再将“事务的一致性”中的“一致性”概念单拿出来进行分析。
ACID一致性
事务要满足ACID约束,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。为了便于表述,我们将这种一致性称为“ACID一致性”。“事务的一致性”中的“一致性”就是指“ACID一致性”。
ACID一致性是指事务的执行不会破坏数据库的完整性约束,所谓的完整性约束包括数据关系的完整性和业务逻辑的完整性。因此,这里的“一致性”指的是完整性约束不会破坏。
这里要着重理解的就是:什么是完整性约束?
我们先举个例子。如图所示,假设完整性约束要求事务执行前后总有数据A和数据B的和为10。那图中的事务致性后,该完整性约束依然满足。因此,这个事务就满足一致性。
这是我们发现,“完整性约束”是一个外在的业务约束。这就意味着,同样的操作,对应的外在的业务约束不同,则该操作可能满足事务条件,又可能不满足事务条件。
假设完整性约束要求事务执行前后总有数据B减数据A为8,那图中的事务便不成立,因为它执行结束后该完整性约束不在满足,即不满足一致性。
说到这里,大家可能发现了一些不对劲的地方。这可能也是大家最开始困惑的源头。因为,在事务的ACID约束中,一致性与其他三个特性也颇有不同。其实这点确实引发了一些争议。
其他三个特性均是事务内在保证的,而一致性的约束条件是由外部业务逻辑规定的。这就意味者,同样的一个操作,根据外部业务逻辑规定的完整性约束的不同,可能满足事务要求,也可能不满足。
一个固定的操作集合,其是不是事务却要由外部业务逻辑规定,显然不是很合理。基于此,有学者甚至怀疑C是为了凑数而加入到ACID约束中的,提议将C从ACID中剔除。当然,这是题外话。对于目前的认知而言,ACID还是一个整体。
其他的一致性
对于“分布式一致性”“一致性哈希”中的一致性,我们就不在这里展开讲了。大家只要知道,它们完全是不同的概念就好。如果大家想要了解其他的一致性,并且对这些概念进行梳理,可以参考这本书籍。
书籍对各种一致性都进行了详细的介绍。对大家体系化地掌握这些知识很有帮助。
这本书对分布式系统相关的理论、实践、工程知识均进行了详细的介绍,层层递进,有助于大家建立完整的分布式系统知识体系。当然,书中也对各种“一致性”进行了分析。并且本书备受好评,以至于还发行了繁体版。
好了,我是程序员易哥。
这回就说这么多!
可以关注我!等我下回接着说!
可以访问个人知乎阅读更多文章:易哥(https://www.zhihu.com/people/yeecode),欢迎关注。