← 返回目录

4. 数据库

第 9 / 152 卷日期:

12、xss攻击、cors攻击原理?

4. 数据库

1、Mysql了解吗,讲一下事务,那mysql是如何保证ACID的呢(答了undo-log,redo-log,加锁,mvcc),那讲一下MVCC

事务是逻辑上的一组操作,要么都执行,要么都不执行。

事务的四大特性原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

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

(1)原子性

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

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

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

(2)隔离性

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

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

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

图 13-1
图 13-1

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

(3)持久性

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

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

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

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

(4)一致性

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

Q:那什么是合法的数据状态呢?

例一:

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

例二:

2、实战解答

一、Mysql 怎么保证一致性的?

(原子性、隔离性、持久性和应用层代码判断)

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

(1)从数据库层面

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

实现一致性。

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

应用层角度考虑。

(3)从应用层面

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

2、Mysql 怎么保证原子性的?(undo log)

OK,是利用Innodb的 undo log。

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

例如:

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

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

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

undo log 记录了这些回滚需要的信息,当事务执行失败或调用了 rollback,导致事务需要回滚,便可以利用undo log 中的信息将数据回滚到修改之前的样子。

3、Mysql 怎么保证持久性的?(redo log)

OK,是利用 Innodb 的 redo log。

正如之前说的,Mysql是先把磁盘上的数据加载到内存中,在内存中对数据进行修改,再刷回磁盘上。如果此时突然宕机,内存中的数据就会丢失。

Q:怎么解决这个问题啊?

A:简单啊,事务提交前直接把数据写入磁盘就行啊。

Q:这样做有什么问题吗?

A:只修改一个页面里的一个字节,就要将整个页面刷入磁盘,太浪费资源了。毕竟一个页面16kb大小,你只改其

于是,决定采用 redo log 解决上面的问题。当做数据修改的时候,不仅在内存中操作,还会在 redo log 中记录这次操作。当事务提交的时候,会将 redo log 日志进行刷盘(redo log一部分在内存中,一部分在磁盘上)。当数据库

宕机᯿启的时候,会将 redo log 中的内容恢复到数据库中,再根据 undo log 和 binlog 内容决定回滚数据还是提交数据。

Q:采用redo log的好处?

A:其实好处就是将redo log进行刷盘比对数据页刷盘效率高,具体表现如下:

redo log体积小,毕竟只记录了哪一页修改了啥,因此体积小,刷盘快。

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

4、Mysql 怎么保证隔离性的?(锁和 MVCC 机制)

OK,利用的是锁和 MVCC 机制。还是拿转账例子来说明,有一个账户表如下:

表名:t_balance

图 15-1
图 15-1

其中id是主键,user_id为账户名,balance 为余额。还是以转账两次为例,如下图所示:

图 16-1
图 16-1

至于MVCC,即多版本并发控制(Multi Version Concurrency Control),一个行记录数据有多个版本对快照数据,这些快照数据在undo log中。

如果一个事务读取的行正在做 DELELE 或者 UPDATE 操作,读取操作不会等行上的锁释放,而是读取该行的快照版本。

由于 MVCC 机制在可᯿复读(Repeateable Read)和读已提交(Read Commited)的MVCC表现形式不同,就不赘述了。

但是有一点说明一下,在事务隔离级别为读已提交(Read Commited)时,一个事务能够读到另一个事务已经提交的数据,是不满足隔离性的。但是当事务隔离级别为可᯿复读(Repeateable Read)中,是满足隔离性的。

MVCC

MVCC 旨在控制多版本并发读写,早期版本只有读读之间可以并发,而读写,写读,写写操作都是阻塞的,引入 mvcc 后,只有写写操作是阻塞的,mysql的实现原理是在数据节点有两个字段列,trid,rollbackpointer。

主要解决问题为在修改操作时,会加上行级锁,但上锁的开销较大,MVCC就是为了解决开销问题而存在,很多情况下,可以代替行级锁。

实现原理是因为每个事务进行修改操作时,都会往 undo.log 中写入内容,而历史版本可以通过前面的 trid 和 rollbackpointer 寻找到快照信息,具体读取哪个快照按隔离级别计算。

(1)快照读(Snapshot Read)

MySQL 数据库,InnoDB 存储引擎,为了提高并发,使用 MVCC 机制,在并发事务时,通过读取数据行的历史数据版本,不加锁,来提高并发的一种不加锁一致性读(Consistent Nonlocking Read)。

(2)读提交(Read Committed)

  1. 数据库领域,事务隔离级别的一种,简称 RC
  2. 它解决“读脏”问题,保证读取到的数据行都是已提交事务写入的
  3. 它可能存在“读幻影行”问题,同一个事务里,连续相同的 read 可能读到不同的结果集

(3)可重复读(Repeated Read)

  1. 数据库领域,事务隔离级别的一种,简称RR
  2. 它不但解决“读脏”问题,还解决了“读幻影行”问题,同一个事务里,连续相同的read读到相同的结果集

Q:6、在读提交(RC),可重复读(RR)两个不同的事务的隔离级别下,快照读有什么不同呢?

先说结论:

  1. 事务总能够读取到,自己写入(update /insert /delete)的行记录
  2. RC 下,快照读总是能读到最新的行数据快照,当然,必须是已提交事务写入的
  3. RR 下,某个事务首次 read 记录的时间为 T,未来不会读取到 T 时间之后已提交事务写入的记录,以保证连

续相同的 read 读到相同的结果集

可以看到:

  1. 和并发事务的开始时间没关系,和事务首次read的时间有关;
  2. 由于不加锁,和互斥关系也不大;

7、你提到了隐藏列有一个DB_ROW_ID,是干嘛的?那假设有10个update,到第九个回滚了,DB_ROLL_PTR如何做的,那提交了是否更新DB_ROLL_PTR?

TODO

8、讲一下索引及其底层,非叶子节点存储的是什么,只有b+树索引吗?(MEMORY是hash索引)

索引是为了快速查找数据,就跟一本书的目录一样。在目录中检索到具体章节的页码,然后直接跳转,就相当于根据索引快速找到数据在磁盘上的地址,然后去读取数据。

MySQL数据库索引采用的是B+Tree结构,在B-Tree结构上做了优化改造。

(1)B-Tree结构

  1. 索引值和data数据分布在整棵树结构中
  2. 每个节点可以存放多个索引值及对应的data数据
  3. 树节点中的多个索引值从左到右升序排列

(2)B+Tree结构:

  1. 非叶子节点不存储data数据,只存储索引值,这样便于存储更多的索引值
  2. 叶子节点包含了所有的索引值和data数据
全站分卷索引 · 152 卷
  1. 1代码随想录知识星球精华(最强八股文)第五版(面经篇)
  2. 2后端面经02-美团
  3. 3Java面经02-阿里ICBU
  4. 4Java面经-04-CVET
  5. 5Java面经-06-字节后端
  6. 6Java面经08-用友
  7. 7Java面经09-快手
  8. 83. 计算机网络
  9. 94. 数据库
  10. 105. 算法
  11. 11Java面经11-美团
  12. 121.3 java的4种引用
  13. 132. JVM
  14. 143. 操作系统
  15. 154. 计算机网络
  16. 165. 数据库
  17. 17Java面经13
  18. 18Java面经14
  19. 19Java面经16
  20. 20Java面经17
  21. 21Java面经18
  22. 22二面
  23. 23三面
  24. 24面经19-Java-字节暑期实习
  25. 25字节三面
  26. 26面经21-Java-蚂蚁暑期实习
  27. 27蚂蚁三面
  28. 28MySQL
  29. 29计算机网络
  30. 30拉链法的工作原理
  31. 31确定桶下标
  32. 32扩容 - 基本原理
  33. 33链表转红黑树
  34. 34子进程和线程的区别
  35. 35协程
  36. 36数据库
  37. 37哈希索引
  38. 38计算机网络
  39. 39TCP和UDP的区别
  40. 40面经25-Java-百度二面
  41. 41面经26-Java-京东一面
  42. 42面经27-Spring
  43. 43计算机基础面经28
  44. 44计算机基础面经29
  45. 45计算机网络
  46. 46操作系统
  47. 47任务调度算法
  48. 48数据库
  49. 49计算机基础面经31
  50. 50乐观锁两种实现机制
  51. 51版本号机制
  52. 52死锁相关问题
  53. 53计算机网络
  54. 54拥塞控制的四种方法
  55. 55计算机基础面经32
  56. 56三次握手的流程
  57. 57计算机基础面经33
  58. 58计算机基础面经34
  59. 59异步
  60. 60C++后端
  61. 61面经3-C++-地平线
  62. 62面经6-C++-国电南瑞
  63. 63面经7-c++后端-字节
  64. 64二面
  65. 65面经11-C++-OPPO
  66. 66面经12-C++-商汤
  67. 67SelectDB
  68. 68面经15-C++-中望
  69. 69面经16-C++-米哈游
  70. 70面经17-C++-旷世
  71. 71面经19-C++-蔚来
  72. 72面经20-C++-第四范式
  73. 73面经21-C++-TP-Link
  74. 74面经23-C++-猿辅导
  75. 75面经25-C++-文远知行
  76. 76面经26-C++-百度
  77. 77百度二面
  78. 78百度三面
  79. 79面经27-C++-ZEKU
  80. 80ZEKU哲库HR面
  81. 81面经28-C++-VIVO
  82. 82面经29-C++-TPLINK
  83. 83字节二面
  84. 84HR面
  85. 85面经32-C++
  86. 86TCP的粘包与拆包
  87. 87引入协程的原因
  88. 88面经34-C++
  89. 892. 指针与引用的区别
  90. 902. Nagle 算法与延迟确认
  91. 91数据库
  92. 922. MVCC-多版本并发控制
  93. 93计算机网络
  94. 94面经36
  95. 95面经37
  96. 96面经38
  97. 97面经39-C++-拼多多+字节
  98. 98字节一面【7.27】
  99. 99shopee测开一面【7.29】
  100. 100一、表面上开销
  101. 101面经44-京东二面
  102. 102Go后端
  103. 103二面
  104. 104面经3-Go-字节日常实习
  105. 105字节二面
  106. 106字节三面
  107. 107HR面
  108. 108面经5-Go-字节暑期实习
  109. 109字节二面
  110. 110字节三面
  111. 111面经02-测开-百度提前批
  112. 112二面
  113. 113面经06-测试-海尔智家
  114. 114面经07-测开-蔚来
  115. 115面经09-测试-中望
  116. 116面经10-测开-ZEKU
  117. 117面经12-测试-科大讯飞
  118. 118面经15-测开-美团暑期实习
  119. 119面经16-测开-外企社招
  120. 120Nvidia四面
  121. 121面经2-前端-百度日常实习
  122. 122面经3-前端-得物面经
  123. 123面经4-前端-腾讯健康
  124. 124面经5-前端-字节面经
  125. 125面经6-前端-携程前端
  126. 126面经7-前端-顺丰
  127. 127面经9-前端-比特大陆日常实习
  128. 128面经10-前端-抖音
  129. 129面经11-前端-蔚来/百度/oppo
  130. 130百度提前批
  131. 131面经12-前端-知乎暑期实习
  132. 132知乎二面
  133. 133百度二面
  134. 134面经2-Android客户端-大疆
  135. 135二面
  136. 136面经3-客户端-字节暑期实习
  137. 137字节二面
  138. 138字节二面(深入项目,1h)
  139. 139面经5-客户端-字节
  140. 140面经6-客户端-字节
  141. 141算法
  142. 142面经3-NLP-科大讯法
  143. 143面经4-NLP-科大讯法
  144. 144面经7-游戏算法-莉莉丝
  145. 145面经10-算法
  146. 146面经11-算法-百度pnc暑期实习
  147. 147百度二面
  148. 148抖音一面
  149. 149嵌入式
  150. 150面经3-嵌入式-芯动科技
  151. 151面经4-嵌入式-韶音科技
  152. 152面经6-嵌入式-新华三