- 1. 事务的特性
- 1.2. 从Isolation(隔离性)衍生出了四种隔离级别
- Read Uncommitted(读取未提交内容)
- Read Committed(读取提交内容)
- Repeatable Read(可重读)
- Serializable(可串行化)
- 1.2. 从Isolation(隔离性)衍生出了四种隔离级别
- 2. MVCC多版本并发控制 原理
- 2.1. 隐藏字段
- 2.2. 可见性算法
- 2.3. MVCC加间隙锁实现幻读防护
- 3. 索引
- 3.1 B树和B+树
- B树
- B+树
- 3.1 B树和B+树
- 5. 数据库语言
- 5.1. DDL语句
- 5.2. DML语句
- 5.3. DQL语句
- 5.4. DCL语句
1. 事务的特性
ACID:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability ),是每一个事务必须所具有的。
- Atomicity(原子性):一个事务中的所有操作,要么全部完成,要么全部不完成,
- Isolation(隔离性):事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。在提交以前对其他事务是不可见的
- Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失,也就是写入了磁盘。
- Consistency(一致性):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。其实就是前三个特性所要做的
1.2. 从Isolation(隔离性)衍生出了四种隔离级别
Read Uncommitted(读取未提交内容)
可以读到其他事务未提交的数据,会发生脏读、不可重复读、幻读。性能最好但一致性最差
Read Committed(读取提交内容)
只能读到其他事务提交的数据,会发生不可重复读、幻读,使用行级锁实现
Repeatable Read(可重读)
保证同一事务中前后获取的数据一致(这里指其他事务提交修改后的值),会发生幻读,MYSQL的默认事务级别,MySQL的InnoDB引擎通过MVCC和间隙锁解决了大部分幻读问题)
Serializable(可串行化)
最高隔离级别,冲突时串行执行,性能最低
不同隔离级别会出现的问题
- 脏读:可以读取其他事务未提交的数据,若其它事务RollBack了,此时这份数据就是脏数据了
- 不可重复读:在一个事务的同一个SQL查询的结果不一致,这里查询结果指update的数据。就是获取到了其他事务修改了的数据
- 幻读:在一个事务中同一个SQL查询的行数不一致,这里指其他事务insert和delete了数据。就是获取到了其他事务插入和删除了的数据
可以发现这几个问题都是围绕一个事务中的数据前后要一致的问题发生的
2. MVCC多版本并发控制 原理
MVCC(Multi-Version Concurrency Control)是现代数据库实现高并发事务处理的核心技术,它通过数据多版本和快照读机制,在保证事务隔离性的同时大幅提升并发性能。
它在不同隔离级别的有实现差异:重点说明RC和RR级别下MVCC的不同行为
RC:通过控制MVCC创建readView的时机来实现每次读取的都是最新的数据。
RR:是在第一次select时创建readView,后续相同的select都使用该readView来保证数据的一致性。
注意:MVCC是在第一次select时创建快照,若在事务A select前事务B提交了,是可以读到事务B提交后的数据的
2.1. 隐藏字段
字段名 | 说明 |
---|---|
DB_TRX_ID | 最近修改该行的事务ID |
DB_ROLL_PTR | 回滚指针,指向旧版本数据 |
DB_ROW_ID | 隐含的自增行ID(无主键时) |
字段解释
2.2. 可见性算法
MVCC和锁协同工作
2.3. MVCC加间隙锁实现幻读防护
MVCC在事务内都是读操作的时候,不会发生幻读的情况,因为都是快照读。只有在快照读和当前读一起使用的时候才会有幻读的问题。什么情况下快照读和当前读会一起使用呢,就是事务中有写操作,MVCC会切换到当前读,此时就会有幻读的情况。
MYSQL在RR隔离级别下是使用MVCC配合间隙锁实现的幻读防护但仍会有幻读问题。
间隙锁是针对索引进行上锁的
3. 索引
简单介绍一下索引的两种数据结构B-树(也叫B树),B+树 和聚簇索引和非聚簇索引
3.1 B树和B+树
B树
B树是一种多叉平衡查找树,如下图主要特点:
- B树的节点中存储着多个元素,每个内节点有多个分叉。
- 节点中的元素包含键值和数据,节点中的键值从大到小排列。也就是说,在所有的节点都储存数据。
- 父节点当中的元素不会出现在子节点中。
- 所有的叶子结点都位于同一层,叶节点具有相同的深度,叶节点之间没有指针连接。
但B树不支持范围查询的快速查找,你想想这么一个情况如果我们想要查找10和35之间的数据,查找到15之后,需要回到根节点重新遍历查找,需要从根节点进行多次遍历,查询效率有待提高。
所以出现了B+树,作为B树的升级版,在B树基础上,MySQL在B树的基础上继续改造,使用B+树构建索引。B+树和B树最主要的区别在于非叶子节点是否存储数据的问题
B+树
B+树在叶子节点上
B树:非叶子节点和叶子节点都会存储数据。
B+树:只有叶子节点才会存储数据,非叶子节点至存储键值。叶子节点之间使用双向指针连接,最底层的叶子节点形成了一个双向有序链表。
5. 数据库语言
5.1. DDL语句
DDL(Data Definition Language)语句: 数据定义语言,主要是进行定义/改变表的结构、数据类型、表之间的链接等操作。常用的语句关键字有 CREATE、DROP、ALTER 等。
CREATE TABLE 表名(
列名1 数据类型,
列名2 数据类型,
列名3 数据类型,
...
)ALTER TABLE 表名;
eg:ALTER TABLE 表名 ADD 列名 数据类型;(添加一个列)ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;(修改列名)ALTER TABLE 表名 DROP 列名;DROP TABLE 表名;
DROP DATABASE 数据库名;
5.2. DML语句
DML(Data Manipulation Language)语句: 数据操纵语言,主要是对数据进行增加、删除、修改操作。常用的语句关键字有 INSERT、UPDATE、DELETE 等。
INSERT INTO 表名 (字段1,字段2,...) values (某值,某值,...),(某值,某值,...);UPDATE 表名 SET 列名=新值 WHERE 限定条件;DELETE FROM 表名 WHERE 限定条件;
5.3. DQL语句
DQL(Data Query Language)语句:数据查询语言,主要是对数据进行查询操作。常用关键字有 SELECT、FROM、WHERE 等。
SELECT 列名 FROM 表名 WHERE 限定条件;
5.4. DCL语句
DCL(Data Control Language)语句: 数据控制语言,主要是用来设置/更改数据库用户权限。常用关键字有 GRANT、REVOKE 等。
一般人员很少用到DCL语句。
GRANT (授权)REVOKE (取消权限)