写点什么

MySQL 面试题精选:事务 ACID 原理,mybatis 架构

作者:MySQL神话
  • 2021 年 11 月 27 日
  • 本文字数:1670 字

    阅读完需:约 5 分钟

本文转载自知乎账号:慕容千语



https://zhuanlan.zhihu.com/p/65438009


本文我们将以从 A 账户转账 50 元到 B 账户为例进行说明一下 ACID,四大特性。


=====================================


原子性


===


根据定义,原子性是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做。即要么转账成功,要么转账失败,是不存在中间的状态!


如果无法保证原子性会怎么样?


OK,就会出现数据不一致的情形,A 账户减去 50 元,而 B 账户增加 50 元操作失败。系统将无故丢失 50 元~


隔离性


===


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


如果无法保证隔离性会怎么样?


OK,假设 A 账户有 200 元,B 账户 0 元。A 账户往 B 账户转账两次,金额为 50 元,分别在两个事务中执行。如果无法保证隔离性,会出现下面的情形



如图所示,如果不保证隔离性,A 扣款两次,而 B 只加款一次,凭空消失了 50 元,依然出现了数据不一致的情形!


ps:可能有细心的读者已经发现了,mysql 中是依靠锁来解决隔离性问题。嗯,我们后面来说明。


持久性


===


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


如果无法保证持久性会怎么样?


在 Mysql 中,为了解决 CPU 和磁盘速度不一致问题,Mysql 是将磁盘上的数据加载到内存,对内存进行操作,然后再回写磁盘。好,假设此时宕机了,在内存中修改的数据全部丢失了,持久性就无法保证。


设想一下,系统提示你转账成功。但是你发现金额没有发生任何改变,此时数据出现了不合法的数据状态,我们将这种状态认为是数据不一致的情形。


一致性


===


根据定义,一致性是指事务执行前后,数据处于一种合法的状态,这种状态是语义上的而不是语法上的。


**那什么


《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享


是合法的数据状态呢?**


oK,这个状态是满足预定的约束就叫做合法的状态,再通俗一点,这状态是由你自己来定义的。满足这个状态,数据就是一致的,不满足这个状态,数据就是不一致的!


如果无法保证一致性会怎么样?


例一:A 账户有 200 元,转账 300 元出去,此时 A 账户余额为-100 元。你自然就发现了此时数据是不一致的,为什么呢?因为你定义了一个状态,余额这列必须大于 0。


例二:A 账户 200 元,转账 50 元给 B 账户,A 账户的钱扣了,但是 B 账户因为各种意外,余额并没有增加。你也知道此时数据是不一致的,为什么呢?因为你定义了一个状态,要求 A+B 的余额必须不变。


实战解答


====


问题一:Mysql 怎么保证一致性的?


OK,这个问题分为两个层面来说。


从数据库层面,数据库通过原子性、隔离性、持久性来保证一致性。也就是说 ACID 四大特性之中,C(一致性)是目的,A(原子性)、I(隔离性)、D(持久性)是手段,是为了保证一致性,数据库提供的手段。数据库必须要实现 AID 三大特性,才有可能实现一致性。例如,原子性无法保证,显然一致性也无法保证。


但是,如果你在事务里故意写出违反约束的代码,一致性还是无法保证的。例如,你在转账的例子中,你的代码里故意不给 B 账户加钱,那一致性还是无法保证。因此,还必须从应用层角度考虑。


从应用层面,通过代码判断数据库数据是否有效,然后决定回滚还是提交数据!


问题二: Mysql 怎么保证原子性的?


OK,是利用 Innodb 的 undo log。


undo log 名为回滚日志,是实现原子性的关键,当事务回滚时能够撤销所有已经成功执行的 sql 语句,他需要记录你要回滚的相应日志信息。


例如


1、当你 delete 一条数据的时候,就需要记录这条数据的信息,回滚的时候,insert 这条旧数据


2、当你 update 一条数据的时候,就需要记录之前的旧值,回滚的时候,根据旧值执行 update 操作


3、当年 insert 一条数据的时候,就需要这条记录的主键,回滚的时候,根据主键执行 delete 操作

线程、数据库、算法、JVM、分布式、微服务、框架、Spring 相关知识

一线互联网 P7 面试集锦+各种大厂面试集锦

学习笔记以及面试真题解析


本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

用户头像

MySQL神话

关注

还未添加个人签名 2021.11.12 加入

还未添加个人简介

评论

发布
暂无评论
MySQL面试题精选:事务ACID原理,mybatis架构