欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

事务的一致性和原子性

程序员文章站 2022-06-02 11:48:17
...

其实我认为一致性是为了使计算机模拟的虚拟世界更加贴近我们的现实世界而提出来的。我们来考虑这样的一个场景:你买一瓶可乐,然后倒了100ml到杯子里面。

那么你的杯子里面必然是从原来一滴可乐都没的状态变成装有100ml可乐的状态,而你的可乐瓶子里面必然是少了100ml可乐。这是毋庸置疑的,因为在自然界中,我们必须遵循“质量守恒定律”。

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

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

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

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

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

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

事务:数据库应用中完成单一逻辑功能的操作集合,是一个既具有原子性又具有一致性的功能,我们要求事务不违反任何数据库的一致性约束,也就是说,如果事务启动时数据是一致的,那么当这个事务成功结束的时候数据库也应该是一致的

关于数据库的一致性这里分享一下我的理解:一致性就是数据库的数据状态符合数据库所描述的业务逻辑和规则。比如最简单的一条一致性规则,银行账户存款余额不能是负值。

适当定义不同事务是程序员的责任,事务的定义应使之能保持数据的一致性。例如资金从账户A转到B可以被定义成两个单独的程序完成,这两个程序依次执行可以保持一致性,但是这两个程序自身都不是把数据库从一个一致的状态转到一个新的一致状态,所以它们都不是事务

但是,在事务执行过程中,必要时允许暂时的不一致性,因为无论是A的取出操作在前还是B的存入操作在前,这两个操作必然有一个先后顺序,两个操作之间就会产生不一致。这种暂时的不一致虽然是必须的,但是在故障发生的时候,很可能导致问题的发生,于是这个时候我们的原子性就发挥作用了。

原子性:事务的所有操作在数据库中要么全部正确反映,要么全部不反映。所以伴随而来的就是事务管理器对各种故障的处理能力,其部分功能就是保证了事务的原子性。

相关标签: mysql 数据库