4. 数据库
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元,分别在两个事务中执行。如果无法保证隔离性,会出现下面的情形:

如图所示,如果不保证隔离性,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

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

至于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)
- 数据库领域,事务隔离级别的一种,简称 RC
- 它解决“读脏”问题,保证读取到的数据行都是已提交事务写入的
- 它可能存在“读幻影行”问题,同一个事务里,连续相同的 read 可能读到不同的结果集
(3)可重复读(Repeated Read)
- 数据库领域,事务隔离级别的一种,简称RR
- 它不但解决“读脏”问题,还解决了“读幻影行”问题,同一个事务里,连续相同的read读到相同的结果集
Q:6、在读提交(RC),可重复读(RR)两个不同的事务的隔离级别下,快照读有什么不同呢?
先说结论:
- 事务总能够读取到,自己写入(update /insert /delete)的行记录
- RC 下,快照读总是能读到最新的行数据快照,当然,必须是已提交事务写入的
- RR 下,某个事务首次 read 记录的时间为 T,未来不会读取到 T 时间之后已提交事务写入的记录,以保证连
续相同的 read 读到相同的结果集
可以看到:
- 和并发事务的开始时间没关系,和事务首次read的时间有关;
- 由于不加锁,和互斥关系也不大;
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结构
- 索引值和data数据分布在整棵树结构中
- 每个节点可以存放多个索引值及对应的data数据
- 树节点中的多个索引值从左到右升序排列
(2)B+Tree结构:
- 非叶子节点不存储data数据,只存储索引值,这样便于存储更多的索引值
- 叶子节点包含了所有的索引值和data数据
全站分卷索引 · 152 卷
- 1代码随想录知识星球精华(最强八股文)第五版(面经篇)
- 2后端面经02-美团
- 3Java面经02-阿里ICBU
- 4Java面经-04-CVET
- 5Java面经-06-字节后端
- 6Java面经08-用友
- 7Java面经09-快手
- 83. 计算机网络
- 94. 数据库
- 105. 算法
- 11Java面经11-美团
- 121.3 java的4种引用
- 132. JVM
- 143. 操作系统
- 154. 计算机网络
- 165. 数据库
- 17Java面经13
- 18Java面经14
- 19Java面经16
- 20Java面经17
- 21Java面经18
- 22二面
- 23三面
- 24面经19-Java-字节暑期实习
- 25字节三面
- 26面经21-Java-蚂蚁暑期实习
- 27蚂蚁三面
- 28MySQL
- 29计算机网络
- 30拉链法的工作原理
- 31确定桶下标
- 32扩容 - 基本原理
- 33链表转红黑树
- 34子进程和线程的区别
- 35协程
- 36数据库
- 37哈希索引
- 38计算机网络
- 39TCP和UDP的区别
- 40面经25-Java-百度二面
- 41面经26-Java-京东一面
- 42面经27-Spring
- 43计算机基础面经28
- 44计算机基础面经29
- 45计算机网络
- 46操作系统
- 47任务调度算法
- 48数据库
- 49计算机基础面经31
- 50乐观锁两种实现机制
- 51版本号机制
- 52死锁相关问题
- 53计算机网络
- 54拥塞控制的四种方法
- 55计算机基础面经32
- 56三次握手的流程
- 57计算机基础面经33
- 58计算机基础面经34
- 59异步
- 60C++后端
- 61面经3-C++-地平线
- 62面经6-C++-国电南瑞
- 63面经7-c++后端-字节
- 64二面
- 65面经11-C++-OPPO
- 66面经12-C++-商汤
- 67SelectDB
- 68面经15-C++-中望
- 69面经16-C++-米哈游
- 70面经17-C++-旷世
- 71面经19-C++-蔚来
- 72面经20-C++-第四范式
- 73面经21-C++-TP-Link
- 74面经23-C++-猿辅导
- 75面经25-C++-文远知行
- 76面经26-C++-百度
- 77百度二面
- 78百度三面
- 79面经27-C++-ZEKU
- 80ZEKU哲库HR面
- 81面经28-C++-VIVO
- 82面经29-C++-TPLINK
- 83字节二面
- 84HR面
- 85面经32-C++
- 86TCP的粘包与拆包
- 87引入协程的原因
- 88面经34-C++
- 892. 指针与引用的区别
- 902. Nagle 算法与延迟确认
- 91数据库
- 922. MVCC-多版本并发控制
- 93计算机网络
- 94面经36
- 95面经37
- 96面经38
- 97面经39-C++-拼多多+字节
- 98字节一面【7.27】
- 99shopee测开一面【7.29】
- 100一、表面上开销
- 101面经44-京东二面
- 102Go后端
- 103二面
- 104面经3-Go-字节日常实习
- 105字节二面
- 106字节三面
- 107HR面
- 108面经5-Go-字节暑期实习
- 109字节二面
- 110字节三面
- 111面经02-测开-百度提前批
- 112二面
- 113面经06-测试-海尔智家
- 114面经07-测开-蔚来
- 115面经09-测试-中望
- 116面经10-测开-ZEKU
- 117面经12-测试-科大讯飞
- 118面经15-测开-美团暑期实习
- 119面经16-测开-外企社招
- 120Nvidia四面
- 121面经2-前端-百度日常实习
- 122面经3-前端-得物面经
- 123面经4-前端-腾讯健康
- 124面经5-前端-字节面经
- 125面经6-前端-携程前端
- 126面经7-前端-顺丰
- 127面经9-前端-比特大陆日常实习
- 128面经10-前端-抖音
- 129面经11-前端-蔚来/百度/oppo
- 130百度提前批
- 131面经12-前端-知乎暑期实习
- 132知乎二面
- 133百度二面
- 134面经2-Android客户端-大疆
- 135二面
- 136面经3-客户端-字节暑期实习
- 137字节二面
- 138字节二面(深入项目,1h)
- 139面经5-客户端-字节
- 140面经6-客户端-字节
- 141算法
- 142面经3-NLP-科大讯法
- 143面经4-NLP-科大讯法
- 144面经7-游戏算法-莉莉丝
- 145面经10-算法
- 146面经11-算法-百度pnc暑期实习
- 147百度二面
- 148抖音一面
- 149嵌入式
- 150面经3-嵌入式-芯动科技
- 151面经4-嵌入式-韶音科技
- 152面经6-嵌入式-新华三