mirror of
https://github.com/CyC2018/Interview-Notebook.git
synced 2026-10-31 11:05:36 +00:00
Update 数据库系统原理.md
为面试中常问的小节加上高频标记。
This commit is contained in:
+12
-12
@@ -3,25 +3,25 @@
|
||||
* [数据库系统原理](#数据库系统原理)
|
||||
* [一、事务](#一事务)
|
||||
* [概念](#概念)
|
||||
* [ACID](#acid)
|
||||
* [ACID](#acid) 🔥
|
||||
* [AUTOCOMMIT](#autocommit)
|
||||
* [二、并发一致性问题](#二并发一致性问题)
|
||||
* [二、并发一致性问题](#二并发一致性问题) 🔥
|
||||
* [丢失修改](#丢失修改)
|
||||
* [脏读](#脏读)
|
||||
* [不可重复读](#不可重复读)
|
||||
* [幻读](#幻读)
|
||||
* [三、封锁](#三封锁)
|
||||
* [三、封锁](#三封锁) 🔥🔥
|
||||
* [封锁粒度](#封锁粒度)
|
||||
* [封锁类型](#封锁类型)
|
||||
* [封锁协议](#封锁协议)
|
||||
* [MySQL 隐式与显式锁定](#mysql-隐式与显式锁定)
|
||||
* [MySQL 中的锁](#mysql-中的锁)
|
||||
* [四、隔离级别](#四隔离级别)
|
||||
* [四、隔离级别](#四隔离级别) 🔥🔥
|
||||
* [未提交读(READ UNCOMMITTED)](#未提交读read-uncommitted)
|
||||
* [提交读(READ COMMITTED)](#提交读read-committed)
|
||||
* [可重复读(REPEATABLE READ)](#可重复读repeatable-read)
|
||||
* [可串行化(SERIALIZABLE)](#可串行化serializable)
|
||||
* [五、多版本并发控制](#五多版本并发控制)
|
||||
* [五、多版本并发控制](#五多版本并发控制) 🔥🔥
|
||||
* [基本思想](#基本思想)
|
||||
* [版本号](#版本号)
|
||||
* [Undo 日志](#undo-日志)
|
||||
@@ -34,7 +34,7 @@
|
||||
* [七、关系数据库设计理论](#七关系数据库设计理论)
|
||||
* [函数依赖](#函数依赖)
|
||||
* [异常](#异常)
|
||||
* [范式](#范式)
|
||||
* [范式](#范式) 🔥
|
||||
* [八、ER 图](#八er-图)
|
||||
* [实体的三种联系](#实体的三种联系)
|
||||
* [表示出现多次的关系](#表示出现多次的关系)
|
||||
@@ -61,7 +61,7 @@
|
||||
|
||||
<div align="center"> <img src="pics/txn-flow.png" width="760px"/> </div><br>
|
||||
|
||||
### ACID
|
||||
### ACID 🔥
|
||||
|
||||
#### 1. 原子性(Atomicity)
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
|
||||
MySQL 默认采用自动提交模式。也就是说,如果不显式使用 START TRANSACTION 或 BEGIN 开始一个事务,那么每条语句都会被当做一个事务并自动提交。
|
||||
|
||||
## 二、并发一致性问题
|
||||
## 二、并发一致性问题 🔥
|
||||
|
||||
在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题。以下例子中,表 account 原有 id 为 1、2 的两行,余额都是 100,图中的结果是在 MySQL 8.0 上用两个会话实际执行得到的(见[附录 A1](#a1-并发一致性问题))。
|
||||
|
||||
@@ -139,7 +139,7 @@ InnoDB 在可重复读下如何避免幻读,见 [六、Next-Key Locks](#六nex
|
||||
|
||||
产生并发不一致性问题的主要原因是破坏了事务的隔离性,解决方法是通过并发控制来保证隔离性。并发控制可以通过封锁来实现,但是封锁操作需要用户自己控制,相当复杂。数据库管理系统提供了事务的隔离级别,让用户以一种更轻松的方式处理并发一致性问题。
|
||||
|
||||
## 三、封锁
|
||||
## 三、封锁 🔥🔥
|
||||
|
||||
### 封锁粒度
|
||||
|
||||
@@ -291,7 +291,7 @@ C 只是一条普通的查询,也被阻塞了。这是因为 B 在等待 MDL
|
||||
|
||||
以上都是悲观锁。数据库中的乐观锁一般用版本号实现,不需要加锁,见 [乐观锁与悲观锁](Java%20并发.md#4-乐观锁与悲观锁)。
|
||||
|
||||
## 四、隔离级别
|
||||
## 四、隔离级别 🔥🔥
|
||||
|
||||
### 未提交读(READ UNCOMMITTED)
|
||||
|
||||
@@ -346,7 +346,7 @@ SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 当前会话之后
|
||||
|
||||
MySQL 8.0 已移除旧的变量名 tx_isolation。SET TRANSACTION 不写 SESSION 或 GLOBAL 时,只对下一个事务有效。
|
||||
|
||||
## 五、多版本并发控制
|
||||
## 五、多版本并发控制 🔥🔥
|
||||
|
||||
多版本并发控制(Multi-Version Concurrency Control, MVCC)是 MySQL 的 InnoDB 存储引擎实现隔离级别的一种具体方式,用于实现提交读和可重复读这两种隔离级别。而未提交读隔离级别总是读取最新的数据行,要求很低,无需使用 MVCC。可串行化隔离级别需要对所有读取的行都加锁,单纯使用 MVCC 无法实现。
|
||||
|
||||
@@ -515,7 +515,7 @@ SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE;
|
||||
- 删除异常:删除一个信息,那么也会丢失其它信息。例如删除了 `课程-1` 需要删除第一行和第三行,那么 `学生-1` 的信息就会丢失。
|
||||
- 插入异常:例如想要插入一个学生的信息,如果这个学生还没选课,那么就无法插入。
|
||||
|
||||
### 范式
|
||||
### 范式 🔥
|
||||
|
||||
范式理论是为了解决以上提到四种异常。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user