说到数据库,那就一定会聊到事务,事务也是面试中常问的问题,我们先来一个面试场景:

面试官:"事务的四大特性是什么?"

我:"ACID,即原子性(Atomicity)、隔离性(Isolation)、持久性(Durability)、一致性(Consistency)!"

面试官:"在 MySQL 数据库的 InnoDB 引擎是怎么实现这四大特性的?"

我:"这个...这个....,还真没有了解过哎"

面试官:"那我们就先这个吧,先回去吧,我们会通知你的~"

这可能是比较常见的面试场景了,你也许回答到了事务的四大特性,但是不一定知道他的实现原理。今天我们就来一起打卡事务的四大特性和实现原理,对于原理的实现,这篇文章只是粗略的介绍一下,更多的细节可以关注我后续的文章。

数据库的事务有四大特性:原子性、隔离性、永久性、一致性,下面将介绍这四大特性的定义和在 InnoDB 引擎中是怎么实现的。

原子性

定义

一次操作是不可分割的,要么全部成功,要么全部失败。比如我们的转账操作,不允许出款方成功,收款方失败这种情况,要么都成功,要么多失败,不可能出现中间状态。

实现

InnoDB 引擎使用 undo log(归滚日志)来保证原子性操作,你对数据库的每一条数据的改动(INSERT、DELETE、UPDATE)都会被记录到 undo log 中,比如以下这些操作:你插入一条记录时,至少要把这条记录的主键值记下来,之后回滚的时候只需要把这个主键值对应的记录删掉就好了。

你删除了一条记录,至少要把这条记录中的内容都记下来,这样之后回滚时再把由这些内容组成的记录插入到表中就好了。

你修改了一条记录,至少要把修改这条记录前的旧值都记录下来,这样之后回滚时再把这条记录更新为旧值就好了。

当事务执行失败或者调用了 rollback 方法时,就会触发回滚事件,利用 undo log 中记录将数据回滚到修改之前的样子。

更多关于 undo log 的信息,后面再单独开一篇文章打卡。

隔离性

定义

多个事务并发执行的时候,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

实现

隔离性可能会引入脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)等问题,为了解决这些问题就引入了“隔离级别”的概念。

SQL 标准的事务隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable):读未提交:一个事务还没提交时,它做的变更就能被别的事务看到。

读提交:一个事务提交之后,它做的变更才会被其他事务看到。

可重复读: 一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。

串行化: 顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

SQL标准中规定,针对不同的隔离级别,并发事务可以发生不同严重程度的问题,具体情况如下:

隔离级别脏读不可重复读幻读读未提交可能可能可能读提交不可能可能可能可重复读不可能不可能可能串行化不可能不可能不可能

上面就是几种隔离级别可能出现的并发问题,但是有必要说一下,你隔离得越严实,效率就会越低。

InnoDB 引擎是如何保证隔离性的?利用锁和 MVCC 机制。这里简单的介绍一下 MVCC 机制,也叫多版本并发控制,在使用 READ COMMITTD、REPEATABLE READ 这两种隔离级别的事务下,每条记录在更新的时候都会同时记录一条回滚操作,就会形成一个版本链,在执行普通的 SELECT 操作时访问记录的版本链的过程,这样子可以使不同事务的读-写、写-读操作并发执行,从而提升系统性能。

持久性

定义

事务一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

实现

要保证持久性很简单,就是每次事务提交的时候,都将数据刷磁盘上,这样一定保证了安全性,但是要知道如果每次事务提交都将数据写入到磁盘的话,频繁的 IO 操作,成本太高,数据库的性能极低,所以这种方式不可取。

InnoDB 引擎是怎么解决的?InnoDB 引擎引入了一个中间层来解决这个持久性的问题,我们把这个叫做 redo log(归档日子)。

为什么要引入 redo log?redo log 可以保证持久化又可以保证数据库的性能,相比于直接刷盘,redo log 有以下两个优势:redo log体积小,毕竟只记录了哪一页修改了啥,因此体积小,刷盘快。

redo log是一直往末尾进行追加,属于顺序IO。效率显然比随机IO来的快。

InnoDB 引擎是怎么做的?当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log 里面,并更新内存,这个时候更新就算完成了。当数据库宕机重启的时候,会将 redo log 中的内容恢复到数据库中,再根据 undo log和 binlog 内容决定回滚数据还是提交数据。

更多 redo log,后面我打算单独写一篇文章。

一致性

定义

一致性简单一点说就是数据执行前后都要处于一种合法的状态,比如身份证号不能重复,性别只能是男或者女,高考的分数只能在0~750之间,红绿灯只有3种颜色,房价不能为负的等等, 只有符合这些约束的数据才是有效的,比如有个小孩儿跟你说他高考考了1000分,你一听就知道他胡扯呢。数据库世界只是现实世界的一个映射,现实世界中存在的约束当然也要在数据库世界中有所体现。如果数据库中的数据全部符合现实世界中的约束(all defined rules),我们说这些数据就是一致的,或者说符合一致性的。

实现

要保证数据库的数据一致性,要在以下两个方面做努力:利用数据库的一些特性来保证部分一致性需求:比如声明某个列为NOT NULL 来拒绝NULL值得插入等。

绝大部分还是需要我们程序员在编写业务代码得时候来保证。

以上就是我今天要分享的内容,希望这篇文章对你的学习或者工作有所帮助,感谢您的阅读。

最后目前互联网上很多大佬都有 MySQL 相关文章,如有雷同,请多多包涵了。原创不易,码字不易,还希望大家多多支持。若文中有所错误之处,还望提出,谢谢。

mysql 事件里定义事物_聊一聊 MySQL 中的事务及其实现原理相关推荐

  1. 如何删除mysql数据库里的表_删除mysql数据表如何操作

    MySQL中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失. 语法 以下为删除MySQL数据表的通用语法: DROP TABLE table_na ...

  2. mysql 回滚之后抛出异常_在PHP中 开始事务后,程序抛出异常 没有执行commit也没有执行rollback mysql事务会回滚吗?...

    网上有人说开启事务后 sql语句执行错误或程序出错 没有执行rollback的情况下,下一次运行就会自动commit 程序出错不会回滚rollback 但是也有人说抛出异常等 程序如果MySQL存在没 ...

  3. mysql4.0事务_聊一聊 MySQL 中的事务及其实现原理

    说到数据库,那就一定会聊到事务,事务也是面试中常问的问题,我们先来一个面试场景: 面试官:"事务的四大特性是什么?" 我:"ACID,即原子性(Atomicity).隔离 ...

  4. mysql distinct多个字段_深入浅出Mysql索引的那些事儿

    一.索引的作用 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重. 在数据 ...

  5. mysql基础小测试三_数据库---MySQL(三)

    一.视图 视图是一个虚拟表,是sql的查询结果,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成.视图的数据变化会影响到基表,基表的数据变化也会影响到视图[i ...

  6. mysql MDL锁如何解决_理解MySQL的MDL元数据锁

    一.MDL锁的作用 MySQL DBA 对于 Waiting for table metadata lock 肯定不会陌生,一般都是进行 alter 操作时被堵住了,导致了我们在 show proce ...

  7. mysql和python的关系_八MySQL与Python

    <1>数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. ...

  8. mysql 自动化运维工具_部署MySQL自动化运维工具inception+archer

    *************************************************************************** 部署MySQL自动化运维工具inception+ ...

  9. mysql主从切换gtid不一致_解决mysql使用GTID主从复制错误问题

    解决mysql使用GTID主从复制错误问题 做MySQL主从的话肯定会遇到很多同步上的问题, 大多数都是由于机器宕机,重启,或者是主键冲突等引起的从服务器停止工作, 这里专门收集类似问题并提供整理解决 ...

最新文章

  1. 图解ElasticSearch 搜索原理
  2. matplotlib cmap
  3. js 上传头像img
  4. dedecms模板中首页实现分页的方法
  5. VB.NET网络是否联通Function
  6. TCL with SNPS sizeof_collectionget_object_namefindget_libslist_attributes
  7. 视频光端机各种视频接口的传输距离是多少?
  8. php authcode java_PHP(authcode)加密解密
  9. leetcode915. 分割数组
  10. java碰到乱码如何解决方法_如何处理java的乱码
  11. 为什么感觉腹部肥胖不好减?
  12. linux网关管理,利用Linux打造安全的管理型网关
  13. win8 桌面显示计算机图标不见了怎么办,win8开始屏幕桌面图标不见了怎么办
  14. discuz 获取会员头像
  15. 梅特勒托利多xk3124电子秤说明书_托利多电子秤详细说明书
  16. 利用RecordRTC支持web端录制屏幕(vue写法)
  17. 从零开始制作一个飞机大战类型的射击游戏
  18. 服务器虚拟机移动,从物理服务器迁移到虚拟机的两大方案
  19. 【企业编程题JAVA】烽火通信2018校招软件工程师
  20. 面试问题:如何开展接口测试

热门文章

  1. 线段树之延时标记(区间修改)及lazy思想
  2. python通过cookie绕过验证码_Python Selenium Cookie 绕过验证码实现登录示例代码
  3. 【LeetCode】LeetCode之删除并获得点数——动态规划、排序+动态规划
  4. 牛客题霸 SQL3 查找当前薪水详情以及部门编号dept_no
  5. JavaScript——易班优课YOOC课群在线测试自动答题解决方案(九)ID标签
  6. JetBrains——账户登录错误(JetBrains Account Error:JetBrains Account connection error: www.jetbrains.com)解决方案
  7. How far away ?
  8. 手机调试java代码_【奇技淫巧】Intellij IDEA调试ysoserial等Java项目的方法
  9. python队列在进程传递_Python 进程队列
  10. 解决LoggerFactory is not a Logback LoggerEither remove Logback or the competing implementation (class