数据库事务的四大特写(ACID)

基本概念介绍:

事务:是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);(参见:事务是什么

原子性(Atomicity):原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。 

一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

隔离性(Isolation):隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

持久性(Durability):持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

使用事务的原因:

这是一个充满意外的世界,一件事情的发展除了取决于我们的计划外也取决于事情发生过程中发生的对事情发展造成影响的意外。而事务的出现就是为了尽可能的避免意外的发生,是事情尽可能的按照我们计划的过程进行发展。而事务的4个特性的来由我们可以通过下面的“栗”子来大略的进行理解:

在一次交易中甲需要向乙转账1000元,而转账的过程如下:
1、交易系统查看甲的账号余额是否超过1000元,如果是则继续,否则无法进行转账;
2、系统从甲的账号中扣除1000元;
3、系统向乙的账号中加入1000元。
如果这个过程中不加任何限制可能存在以下状况:
1、系统查询到甲账号余额小于1000元,无法进行转账;
2、系统查询到甲账号余额超过1000元并顺利进行转账;
3、系统查询到甲账号余额超过1000元进行转账,但是系统执行到步骤2出错了,导致甲被扣除了1000元,而乙未收到钱;
4、系统检测到甲账号余额超过1000元进行转账,但是在不在3中由于系统出错向乙中账号转入的是1001元;
5、系统检测到甲账号余额超过1000元进行转账,但是这个时候有人用加的账号取走了部分钱导致扣款失败;
6、系统检测到甲账号余额超过1000元并顺利转账,但是之后的某个时间存储信息的系统发生故障时间在经过抢修后恢复到转账前的数据;
。。。。。。意外情况太多这里就只列举其中的几个

分析:在交易过程中前两种情况均属于计划中的情况,而后3中情况则是我们需要避免的意外情况。为了避免情况3的出现,我们需要规定每次转账必须完成所有步骤,否则就什么都不做,而这对应的正是原子性的特性;为了避免情况4,我们需要规定系统扣除的甲的金额应该等于乙账号中增加的金额,从而保证转账过程中所涉及到的两个账号种的金额在操作的过程中保持不变,而这对应的是事务的一致性;为了避免情况5的出现,我们需要规定在本次转账的过程中该账号不同进行其他的转账操作,这对应的是事务的隔离性;为了避免情况6的出现,我们需要对已经完成的操作进行备份,从而避免数据信息的丢失,这对应的是事务的持久性。

四大特性实现原理:

事务的ACID特性主要通过并发控制日志恢复两种方式来共同实现。其中并发控制技术通过锁机制来保证了事务的隔离性,使数据库的一致性状态不会因为并发执行的操作被破坏。日志恢复技术通过将事务执行的过程按顺序记录在日志中来使一致性状态不会因事务或系统故障被破坏;同时使已提交的对数据库的修改不会因系统崩溃而丢失,保证了事务的持久性。另外,数据库通过提交回滚两个动作来对数据库的操作信息进行管理,在一个事务未提交之前事务的操作信息只写在日志上,只有当事务所有操作均完成以后执行提交才会对数据库中的数据进行实际的操作,而当事务执行失败时,数据库调用回滚操作对日志上记录的该记录的操作进行删除,从而达到一个事务要么全部完成,要么什么都不做的目的,即实现事务的原子性

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值