一、 引言

做数据库相关工作的同学都知道事务,就是一个操作序列 ,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位, ACID又是事务的四大特性。

那么就会有如下疑问:

  • ACID具体代表什么?
  • MySQL InnoDB引擎又是如何实现ACID的呢?

二、 ACID详解

ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

2.1 原子性(Atomicity)

一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作。

实现事务的原子性,数据库要支持回滚操作,在事务中某个操作失败后,回滚到事务之前的状态。

大多数数据库实现事务时,事务操作的数据是在事务相关的数据快照上,并不是真正修改实际的数据,如果有错不提交即可。而其他一些只支持简单事务的数据库系统中,事务更新数据不在快照上,而是直接操作实际数据,则系统需要先预演一遍所有要执行的操作,如果失败,事务相关的所有操作都不会被执行。

2.2 一致性(consistency)

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

如转账的栗子: 假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

事务的一致性决定了一个系统设计和实现的复杂度,因为事务可以有不同程度的一致性:

  • 强一致性: 无论更新操作实在哪一个数据副本执行,之后所有的读操作都能获得最新的数据。
  • 弱一致性: 提交的更新操作,不一定立即会被读操作读到,需要一段时间,此种情况会存在一个不一致窗口。
  • 最终一致性: 是弱一致性的特例。事务更新一份数据,最终一致性保证在没有其他事务更新同样的值的话,最终所有的事务都会读到之前事务更新的最新值。如果没有错误发生,不一致窗口的大小依赖于:通信延迟,系统负载等。

2.3 隔离性(Isolation)

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

当前大多数数据库都提供了不同级别的事务隔离,之后便会产生不同的问题,一般会出现的问题主要有:

  • 脏读

脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。

当一个事务A正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时另外一个并发的事务B来访问该数据,将会获取到事务A中没有提交的数据, 从而最终造成两个事务得到的数据不一致。

如: 张三有500块钱,现在给李四转100块钱,这个事务中的SQL涉及到两个操作:

1、 A账户减100块钱

 update account set money=money - 100 where name=’张三’;

2、 B账户加100块钱

update account set money=money+100 where name=’李四’;

我们假设事务A执行转账,刚执行完第一条SQL语句,此时,另外一个事务B来查询张三账户的钱,那么获取到的是400块钱。但是事务A执行第二条语句的时候出现了问题,事务A进行了回滚,那么事实上张三账户的钱应该是500块钱,而不是400块钱,从而出现了脏读。

  • 不可重复读

不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。

例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。

不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

  • 幻读

幻读,是指当事务不是独立执行时发生的一种现象。

例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

  • 丢失更新

两个事务同时读取同一条记录,A先修改记录,B也修改记录(B是不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。

2.4 持久性(Durability)

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

三、 参考文献

MySQL ACID及四种隔离级别的解释

事务ACID特性及4种隔离级别详解

数据库事务的四大特性以及事务的隔离级别详解

同一个事务里面对同一条数据做2次修改_[玩转MySQL之九]MySQL事务ACID[2-1]ACID详解...相关推荐

  1. 同一个事务里面对同一条数据做2次修改_要我说,多线程事务它必须就是个伪命题!

    这是why技术的第 74 篇原创文章 别问,问就是不行 分布式事务你应该是知道的.但是这个多线程事务...... 没事,我慢慢给你说. 如图所示,有个小伙伴想要实现多线程事务. 这个需求其实我在不同的 ...

  2. 同一个事务里面对同一条数据做2次修改_MySQL事务与MVCC如何实现的隔离级别

    有情怀,有干货,微信搜索[三太子敖丙]关注这个不一样的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. ...

  3. ajax改变json指向,Ajax遍历jSon后对每一条数据进行相应的修改和删除(代码分享)

    废话不多说了,直接给大家贴代码了,具体代码如下所示: $.ajax({ url: "/business/findpersons.json", dataType: "jso ...

  4. ajax修改属性后如何遍历,Ajax遍历jSon后对每一条数据进行相应的修改和删除(代码分享)...

    废话不多说了,直接给大家贴代码了,具体代码如下所示: $.ajax({url: "/business/findpersons.json",dataType: "json& ...

  5. qt中的mysql能存入多少行数据_Qt中提高sqlite的读写速度(使用事务一次性写入100万条数据)...

    SQLite数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度.例如:向数据库中插入100万条数 ...

  6. 1万条数据大概占多大空间_Java互联网架构-性能优化Mysql索引数据结构详解

    欢迎关注头条号:java小马哥 周一至周日下午三点半!精品技术文章准时送上!!! 精品学习资料获取通道,参见文末 一,索引数据结构红黑树,Hash,B+树详解 索引是帮助MySQL高效获取数据的排好序 ...

  7. mysql数据转存到时序数据库_干货丨如何高速迁移MySQL数据到时序数据库DolphinDB...

    DolphinDB提供了两种导入MySQL数据的方法:ODBC插件和MySQL插件.我们推荐使用MySQL插件导入MySQL数据,因为它的速度比ODBC导入更快,导入6.5G数据,MySQL插件的速度 ...

  8. php能做定时关机吗,window_win10怎么定时关机?Win10系统定时关机命令使用方法详解,对于电脑用户来说,定时关机 - phpStudy...

    win10怎么定时关机?Win10系统定时关机命令使用方法详解 对于电脑用户来说,定时关机有时候经常会用到,比如夜间下载东西或者下载一些大文件,而又没有时间一直守着电脑,这时候设置电脑定时关机就很实用 ...

  9. 事务没提交的数据查的出来吗?_品牛栏山,论分布式事务

    上周末,我和一个在电商上市公司做开发的朋友一起喝酒聊天,他目前带一个研发团队,负责大系统中退货款相关的技术服务版块,混的挺不错,从一个初级程序员做到规模很大上市公司的技术负责人,一路过来也非常坎坷,刚 ...

最新文章

  1. 一家大型公司的nginx配置
  2. ios PNG Crush error (PNG图片错误)
  3. 超越SimCSE两个多点,Prompt+对比学习的文本表示新SOTA
  4. python模块之codecs: 自然语言编码转换
  5. 徐家骏:华为十年感悟
  6. 阿里巴巴交易平台技术揭秘
  7. 微信扫码提示在浏览器中打开的2种实现方式
  8. Debian安装和配置CA证书
  9. 伽罗华域(Galois Field,GF,有限域)乘法运算
  10. 使用RMF报表设计器进行报表设计
  11. 马化腾:没有“备胎”会永远被人掐住喉咙
  12. Java编写图像浏览器_浏览器下载图像(JAVA代码)
  13. 设计模式学习(汇总版)
  14. vue3 倒计时3秒后返回首页
  15. Unity 碰撞体 composite
  16. 爆款短视频自媒体的8大黄金法则,学会了,就离爆款不远了
  17. hbuilder能用python_hbuilder之开发Python。
  18. 阿里云 服务器,云盾的ip占用大量流量的问题
  19. UPX编译及so加固
  20. python写数字,Python3生成手写体数字方法

热门文章

  1. magento邮件使用php,用Magento的Email模板机制发邮件
  2. python植树问题代码_BERT可以上几年级了?Seq2Seq“硬刚”小学数学应用题
  3. MySQL反斜杠 ‘\\‘ 插入数据库丢失
  4. 上海传音控股驱动开发笔试题
  5. ffmpeg(5):SDL相关学习
  6. jni实现回调java函数
  7. 视频编解码(九):FFMPEG操作总结一
  8. win10开启多用户同时远程登录-很详细
  9. 中点击按钮新建widget_如何在iOS14中创建堆叠小组件?
  10. python步骤切片_python中的切片操作