数据库 / 事务的 ACID

事务是数据库系统确保数据一致性的关键机制。通过原子性、隔离性、一致性和持久性(ACID)四大特性,事务保证了操作的完整性。以转账为例,事务确保了资金转移的准确无误,避免了数据不一致的情况。当事务中的任何一步失败,整个事务将回滚,保持数据的原始状态。事务的存在解决了并发操作可能带来的问题,保证了系统在异常情况下的数据一致性。

一、什么是事务?

在数据库系统里而言,事务是代表一个或者一系列操作的最小逻辑单元,所有在这个逻辑单元内的操作要么全部成功,要么就全部失败,不存在任何中间状态,一旦事务失败那么所有的更改都会被撤消,一旦事务成功所有的操作结果都会被保存。


二、为什么要有事务?

如果无法直观的从概念上理解事务的话,那我们可以尝试从它解决问题的出发点来了解它。事务机制存在的目的就是无论我们的操作过程中是成功、失败、异常、或是受到干扰的情况下,事务都能保证我们数据最终的一致性。

为了让大家重视和理解事务的作用,所以我们必须看一个和钱有关的例子:

案例:转账

A 账户余额有1000元,B 账户余额 0 元,在这个基础上 A 向 B 转账 400 元,流程如下:

1、查询 A 账户余额,看金额是 >= 400 元。

2、满足条件则先从 A 账户扣款 400 元(当前 A 余额 = 600、当前 B 余额 = 0)。

3、然后再向 B 账户增加 400 元(当前 A 余额 = 600、当前 B 余额 = 400)。

三、没有事务支持的情况下会是什么样?

如果上面每个操作都是独立的,那么任意一个操作的失败都不会影响下一步操作,这样就可能会出现下面几个场景:

情况一:在执行完第 2 步后,执行第 3 步系统发生异常失败了,那么最后的结果 A 余额 = 600,B 账户余额 = 0;

情况二:在执行第 2 步失败了,然后继续执行第 3 步, 那么最后的结果 A 余额 = 1000,B 余额 = 400;

很明显这样直接会导致严重的问题,因为这样的情况下系统会凭空减少或多出钱出来,所以我们需要一套事务机制来容许在异常情况下,能让数据恢复到最初的样子。

四、有事务支持的情况会是什么样?

其实在这个操作中,转账就是本次一系列操作的最小逻辑单元,只有3个操作都成功了才算转账成功,任何一个步骤失败都算整个转账操作失败,只要其中任意一个步骤执行失败都不会再往下执行,并对已经执行的数据变更进行恢复。

转账操作开始

1、查询A账户余额,看金额是 >= 400 元 (失败则整个转账失败)。

2、满足条件则先从 A 账户扣款 400 元(当前 A 余额 = 600、当前 B 余额 = 0)(失败则整个转账失败)。

3、然后再向 B 账户增加 400 元(当前 A 余额 = 600、当前 B 余额 = 400)(失败则整个转账失败,同时把上一步的扣款 400 返还给 A 账户)。

转账操作结束

这样在事务的机制下,不管转账成功还是失败系统数据最终都是一致的,钱才不会出现凭空变多或者减少,这也是事务存在的意义。


五、事务的特性(ACID)

要实现事务的最终目的,需要几种机制组合才能实现,这几种机制就是事务的几个特性,分别原子性、隔离性、一致性、持久性。 用一句话总结来总结这几个特性之间的关系,那就是“一致性是事务的最终目的,而原子性、隔离性、持久性其实都是为了实现一致性的手段”。

1、原子性(Atomicity)

概念:一个事务必须是一系列操作的最小单元,这系列操作的过程中,要么整个执行,要么整个回滚,不存在只执行了其中某一个或者某几个步骤。

对应到上面的转账操作中,原子性就代表(检查余额、转账、到账)三个步骤就是一个整体,少了任何一个都不能称为一次转账,整个过程中检查余额、转账、到账要么整体都执行,要么一个失败就整体失败,绝对不会出现某一个执行成功其它的都执行失败,或者某一个执行失败其它的操作执行成功的情况。

2、隔离性(Isolation)

概念:隔离性是说两个事务的执行都是独立隔离开来的,事务之前不会相互影响,多个事务操作一个对象时会以串行等待的方式保证事务相互之间是隔离的。

小明和小芳各自有一本作业本,如果他们同时去写作业,这时他们都可以在各自作业本上写作业是相互不影响的。但是如果他们两个人只有一本作业本,但是他们都想去写作业怎么办,那么就这个时候就只能等一个人先写完作业后,另外一个人才能写,要不然两个人同时在同一个作业本上写作业,那么肯定会乱套。所以这种两个事物操作同一个对象必须隔离开来不能相互影响的特性称为事务的隔离性。

3、一致性(Consistency)

概念:事务要保证数据库整体数据的完整性和业务的数据的一致性,事务成功提交整体数据修改,事务错误则回滚到数据回到原来的状态;

如上面转账的案例,如果事务提交成功则A账户减金额,B账户则加对应的金额,数据库总体金额不变只是载体变了。如果事务出错则整体回滚,无论到了上面的哪个步骤A和B的数据都会回到最事务开启前的状态保证数据的始终一致;

4、持久性(Durability)

概念:持久性是指一旦事务成功提交后,只要修改的数据都会进行持久化,不会因为异常、宕机而造成数据错误或丢失。

转载于:https://zhuanlan.zhihu.com/p/27789602

(SAW:Game Over!)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值