什么是事务的一致性?

事务的ACID特性

事务主要有四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability)
下面我们分别来介绍着几种性质。

原子性

原子性是指事务中的一系列操作,要么全做,要么全部不做。

隔离性

一个事务的执行不被另一个事务的执行干扰。

持续性

持续性也称为永久性,指一个事务一旦提交,它对数据库中数据的改变是永久性的。

一致性

上面的三个特性都非常好理解,而“一致性”就相对难以理解了。我在很多教材、博客、知乎和一些论坛上看过对“一致性”的解释,基本上都没有给出详细的定义,而是通过举例子:银行转账的例子来说明。

其实我认为一致性是为了使计算机模拟的虚拟世界更加贴近我们的现实世界而提出来的。我们来考虑这样的一个场景:你买一瓶可乐,然后倒了100ml到杯子里面。
在这里插入图片描述
那么你的杯子里面必然是从原来一滴可乐都没的状态变成装有100ml可乐的状态,而你的可乐瓶子里面必然是少了100ml可乐。这是毋庸置疑的,因为在自然界中,我们必须遵循“质量守恒定律”。

我们再考虑一个场景:你上班挤地铁的时候,口袋里装了1000块现金,不料被小偷偷了300块钱。
在这里插入图片描述
那么你将损失了300,而小偷收入300,这是必然的。

在我们的生活中还有很多这样的例子,我们可以大开脑洞地去想一下,其实它们都是“守恒”的。然而,计算机模拟的世界可不是现实世界,而是虚拟世界,虚拟世界未必遵循这种守恒!假设我现在去ATM机转账,将我的建设银行卡的1000块钱转到中国银行的卡里去。程序可能是这样执行的:

第一步:从建设银行卡的余额里扣除1000;
第二步:然后再从中国银行的卡的余额里增加1000。

假如在第一步执行完之后服务器宕机了,那么显然第二步将无法完成,我的建设银行卡被扣了1000,但中国银行的卡却没增加,这个时候就发生了“不守恒”,我将白白损失了1000块钱。在数据库中,这就是所谓的“不一致性状态”。

可是自然界中是应该要保持“守恒”的,我们用计算机模拟现实世界也应该做到这一点,所以前人才提出了“一致性”的概念,使得计算机世界与现实世界更加贴近。那么如何实现“一致性”呢?

事实上,ACID中的AID都是为了实现C的。事务的最终目的就是为了实现“一致性”。如果转账的操作具有原子性,那么在中途出现错误的时候发生回滚,就不会出现不一致的情况,可见,“原子性”和“一致性”是紧密联系在一起的!

发布了17 篇原创文章 · 获赞 6 · 访问量 638

猜你喜欢

转载自blog.csdn.net/weixin_36979214/article/details/104794592