数据库 / 事务的 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!)
数据库 / 事务的 ACID相关推荐
- 数据库事务的ACID特性及含义
数据库事务的ACID特性及含义 1.原子性(Atomic) 一个事务被视为一个不可分割的最小工作单元,这个事务里的所有操作要么全部成功执行,要么全都不执行,不能只执行其中的一部分操作.实现事务的原子性 ...
- 数据库事务的ACID及隔离级别
文章目录 ACID 概念 四大特性 并发控制 隔离级别 串行化 可重复读 提交读 未提交读 默认隔离级别 读现象举例 脏读 不可重复读 幻读 隔离级别 VS 读现象 隔离级别 VS 锁持续时间 ACI ...
- 数据库事务管理ACID
一.事务 定义:所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位. 准备工作:为了说明事务的ACID原理,我们使用银行账户及资金管理的案例进行分析. [sql] ...
- 数据库事务的 ACID 特性
事务 概念:事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚. ACID: 1. 原子性(Atomicity) 事务被视为不可分割 ...
- 数据库事务的ACID特性
2,面试常考的ACID属性: ① 原子性:事务是应用中不可再分的最小逻辑执行单位体,要么都执行,要么都不执行. ② 一致性:事务结束后,数据库内的数据是合法正确的:(数据不被破坏)['数据守恒'] ③ ...
- 数据库事务ACID原则学习分享
本人结合自己对技术的理解,努力以通俗易懂的内容帮助大家了解技术的基本原理,内容仅供参考,不对或不完善的地方请大家指教,感谢关注! 一.事务概念的引入 当今,信息化技术非常发达的时代,我们通过手机上的银 ...
- oracle 事务实现原理,数据库事务的实现原理
1. 前言 都知道数据库事务有ACID特性(原子性.一致性.隔离型.持久性),本文简单聊一下它们的实现原理. 2. 日志文件 2.1. redo log redo log叫做重做日志,是用来实现事务的 ...
- 【译】数据库事务隔离级别
看到wikipedia中文关于数据库相关的几个经典条目有点老旧,尤其和英文条目相比.确定开始翻译其中几篇,先从事务隔离等级开始.格式采用维基Sandbox发布后的格式.翻译完后自己校对过几遍,质量还可 ...
- java mysql数据库回退_数据库事务及Java中的处理
事 务是指一组相互依赖的操作行为,举一个举得不能再被举的例子就是银行交易,当然还有其他像网上购物,电子货币交易等等,事务的成功取决于这些相互依赖的操 作行为是否都能执行成功,只要有一个操作行为失败,就 ...
最新文章
- 别说,Cerebro还真好用!老板再也不用担心ES集群了
- Switch入门第一讲
- BaseActivity的抽取
- 360极速浏览器使用postman
- 信息学奥赛一本通(1121:计算矩阵边缘元素之和)
- 下面哪个选项不是oracle用户,作业三(有答案)
- Linux命令解释之vi
- Python中的注释和文档
- arcgis建立拓扑关系
- nginx+rtmp(或http-flv)+ffmpeg搭建流媒体视频直播服务器
- Excel中如何使用COLUMN和COLUMNS函数
- 计算机常用键的作用,键盘功能键大全2017 电脑键盘常用按键功能详解
- Windows 基本操作命令
- 【源码】王者装逼工具/提升几倍的等级战力
- 关于学生和老师关系的换位思考
- 浅谈技术管理者的角色认知与自我管理
- 我的世界java服务器地址ip_我的世界服务器地址大全
- 喜讯 安超云正式成为“同心生态联盟”会员单
- P4318-莫比乌斯函数+容斥
- 数据库的定义、建立和维护