File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ > 这个问题经常问,但是问我的比较少,其实MySQL这一块,问的最多还是优化问题
2+
3+ 面试官:聊聊ACID是什么
4+
5+ 我:分别是:** 原子性(Atomicity)** 、** 一致性(Consistency)** 、** 隔离性(Isolation)** 和** 持久性(Durability)** 。
6+
7+ 1 . 原子性:
8+
9+ 根据定义,原子性是指一个事务是一个不可分割的工作单位,** 其中的操作要么都做,要么都不做** 。即要么转账成功,要么转账失败,是不存在中间的状态!比如:如果不保证原子性,OK,就会出现数据不一致的情形,A账户减去50元,而B账户增加50元操作失败。系统将无故丢失50元~ 。可能会聊undolog
10+
11+ 2 . 一致性:
12+
13+ 根据定义,一致性是指事务执行前后,数据处于一种合法的状态,这种状态是语义上的而不是语法上的。 那什么是合法的数据状态呢? oK,这个状态是满足预定的约束就叫做合法的状态,再通俗一点,这状态是由你自己来定义的。** 满足这个状态,数据就是一致的,不满足这个状态,数据就是不一致的!** 比如:A给B转100,B不能因为通过这个事务增加了150吧?或者A扣了150吧?
14+
15+ 3 . 隔离性:
16+
17+ 根据定义,隔离性是指** 多个事务并发执行的时候,事务内部的操作与其他事务是隔离的** ,并发执行的各个事务之间不能互相干扰。
18+
19+ 4 . 持久性:
20+
21+ 根据定义,** 持久性是指事务一旦提交,它对数据库的改变就应该是永久性的** 。接下来的其他操作或故障不应该对其有任何影响。这里可能会让你聊redolog
22+
23+ 面试官:并发事务带来的问题都有哪些
24+
25+ 我:** 脏读、不可重复读和幻读(实际上还有一个丢弃修改)**
26+
27+ 1 . ** 脏读**
28+
29+ 第一个事务首先读取变量为50,接着准备更新为100的时,并未提交,第二个事务已经读取为100,此时第一个事务做了回滚。最终第二个事务读取的变量和数据库的不一样。
30+
31+ 2 . ** 丢弃修改**
32+
33+ T1 和 T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,** T2 的修改覆盖了 T1 的修改** 。例如:事务1读取某表中的数据A=50,事务2也读取A=50,事务1修改A=A+50,事务2也修改A=A+50,最终结果A=100,事务1的修改被丢失。
34+
35+ 3 . ** 不可重复读**
36+
37+ T2 读取一个数据,T1 对该数据做了修改并提交。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。
38+
39+ 4 . ** 幻读**
40+
41+ T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和第一次读取的结果不同。(和不可重复读的区别:一个是变量变化,一个是范围变化)
42+
43+ 面试官:数据库的隔离界别?
44+
45+ 我:
46+
47+ 首先,MySQL InnoDB 存储引擎的默认支持的隔离级别是 ** REPEATABLE-READ** (可重读)
48+
49+ 其次,** 这里需要注意的是** :与 SQL 标准不同的地方在于InnoDB 存储引擎在 REPEATABLE-READ(可重读)事务隔离级别 下使用的是** Next-Key Lock 锁** 算法,因此可以避免幻读的产生,这与其他数据库系统(如 SQL Server)是不同的。所以 说InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读) 已经可以完全保证事务的隔离性要 求,即达到了 SQL标准的SERIALIZABLE(可串行化)隔离级别。
50+
51+ 因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取提交内容):,但是你要知道的是InnoDB 存储引擎默认使用 ** REPEATABLE-READ(可重读)并不会有任何性能损失** 。
52+
53+ 1 . 未提交读
54+
55+ 事务中发生了修改,即使没有提交,其他事务也是可见的,比如对于一个数A原来50修改为100,但是我还没有提交修改,另一个事务看到这个修改,而这个时候原事务发生了回滚,这时候A还是50,但是另一个事务看到的A是100.** 可能会导致脏读、幻读或不可重复读**
56+
57+ 2 . 提交读
58+
59+ 对于一个事务从开始直到提交之前,所做的任何修改是其他事务不可见的,举例就是对于一个数A原来是50,然后提交修改成100,这个时候另一个事务在A提交修改之前,读取的A是50,刚读取完,A就被修改成100,这个时候另一个事务再进行读取发现A就突然变成100了;** 可以阻止脏读,但是幻读或不可重复读仍有可能发生**
60+
61+ 3 . 可重复读
62+
63+ 就是对一个记录读取多次的记录是相同的,比如对于一个数A读取的话一直是A,前后两次读取的A是一致的;** 可以阻止脏读和不可重复读,但幻读仍有可能发生**
64+
65+ 4 . 可串行读
66+
67+ 在并发情况下,和串行化的读取的结果是一致的,没有什么不同,比如不会发生脏读和幻读;** 该级别可以防止脏读、不可重复读以及幻读**
68+
Original file line number Diff line number Diff line change 6868- [ 类文件结构] ( /Interview/sad/类文件结构.md )
6969- [ 类加载过程] ( /Interview/sad/类加载过程.md )
7070- [ 类加载器] ( /Interview/sad/类加载器.md )
71- - [ JVM内存区域] (/Interview/sad/JVM内存区域.md
71+ - [ JVM内存区域] ( /Interview/sad/JVM内存区域.md )
7272- [ 逃逸分析] ( /Interview/sad/逃逸分析.md ) )
7373- [ 对象的创建过程] ( /Interview/sad/对象的创建过程.md )
7474- [ 垃圾回收] ( /Interview/sad/垃圾回收.md )
7575- [ InnoDB和MyISAM] ( /Interview/sad/InnoDB和MyISAM.md )
76+ - [ MySQL的ACID和隔离级别] ( /Interview/sad/MySQL的ACID和隔离级别.md )
7677
7778## 刷题系列
7879- [ 推荐:CS-Notes] ( https://cyc2018.github.io/CS-Notes/#/?id=✏️-算法 )
You can’t perform that action at this time.
0 commit comments