auto commit

This commit is contained in:
CyC2018
2019-12-06 10:11:23 +08:00
parent 532e1f64d3
commit 7c2454cf8e
114 changed files with 536 additions and 532 deletions

View File

@ -47,7 +47,7 @@
事务指的是满足 ACID 特性的一组操作可以通过 Commit 提交一个事务也可以使用 Rollback 进行回滚
<div align="center"> <img src="pics/f74144be-857a-40cd-8ec7-87626ef4e20b.png" width="400px"> </div><br>
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/f74144be-857a-40cd-8ec7-87626ef4e20b.png" width="400px"> </div><br>
## ACID
@ -80,7 +80,7 @@
- 在并发的情况下多个事务并行执行事务不仅要满足原子性还需要满足隔离性才能满足一致性
- 事务满足持久化是为了能应对数据库崩溃的情况
<div align="center"> <img src="pics/417bc315-4409-48c6-83e0-59e8d405429e.jpg" width="400px"> </div><br>
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/417bc315-4409-48c6-83e0-59e8d405429e.jpg" width="400px"> </div><br>
## AUTOCOMMIT
@ -94,25 +94,25 @@ MySQL 默认采用自动提交模式。也就是说,如果不显式使用`STAR
T<sub>1</sub> T<sub>2</sub> 两个事务都对一个数据进行修改T<sub>1</sub> 先修改T<sub>2</sub> 随后修改T<sub>2</sub> 的修改覆盖了 T<sub>1</sub> 的修改
<div align="center"> <img src="pics/75184b58-c627-4edc-8dcf-605762ebb733.png" width="320px"> </div><br>
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/75184b58-c627-4edc-8dcf-605762ebb733.png" width="320px"> </div><br>
## 读脏数据
T<sub>1</sub> 修改一个数据T<sub>2</sub> 随后读取这个数据如果 T<sub>1</sub> 撤销了这次修改那么 T<sub>2</sub> 读取的数据是脏数据
<div align="center"> <img src="pics/af0e94d9-502d-4531-938f-d46dd29de52d.png" width="360px"> </div><br>
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/af0e94d9-502d-4531-938f-d46dd29de52d.png" width="360px"> </div><br>
## 不可重复读
T<sub>2</sub> 读取一个数据T<sub>1</sub> 对该数据做了修改如果 T<sub>2</sub> 再次读取这个数据此时读取的结果和第一次读取的结果不同
<div align="center"> <img src="pics/66ae164c-ad47-4905-895e-51fe38ce797a.png" width="360px"> </div><br>
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/66ae164c-ad47-4905-895e-51fe38ce797a.png" width="360px"> </div><br>
## 幻影读
T<sub>1</sub> 读取某个范围的数据T<sub>2</sub> 在这个范围内插入新的数据T<sub>1</sub> 再次读取这个范围的数据此时读取的结果和和第一次读取的结果不同
<div align="center"> <img src="pics/8fdc577d-552d-4b43-b5e4-a8f98bc2cb51.png" width="340px"> </div><br>
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/8fdc577d-552d-4b43-b5e4-a8f98bc2cb51.png" width="340px"> </div><br>
----
@ -285,17 +285,17 @@ SELECT ... FOR UPDATE;
## 可重复读REPEATABLE READ
保证在同一个事务中多次读取同数据的结果是一样的
保证在同一个事务中多次读取同数据的结果是一样的
## 可串行化SERIALIZABLE
强制事务串行执行
强制事务串行执行这样多个事务互不干扰不会出现并发一致性问题
需要加锁实现而其它隔离级别通常不需要
该隔离级别需要加锁实现因为要使用加锁机制保证同一时间只有一个事务执行也就是保证事务串行执行
----
| 隔离级别 | 脏读 | 不可重复读 | 幻影读 |
| | 脏读 | 不可重复读 | 幻影读 |
| :---: | :---: | :---:| :---: |
| 未提交读 | | | |
| 提交读 | × | | |
@ -304,10 +304,12 @@ SELECT ... FOR UPDATE;
# 多版本并发控制
多版本并发控制Multi-Version Concurrency Control, MVCC MySQL InnoDB 存储引擎实现隔离级别的一种具体方式用于实现提交读和可重复读这两种隔离级别而未提交读隔离级别总是读取最新的数据行无需使用 MVCC可串行化隔离级别需要对所有读取的行都加锁单纯使用 MVCC 无法实现
多版本并发控制Multi-Version Concurrency Control, MVCC MySQL InnoDB 存储引擎实现隔离级别的一种具体方式用于实现提交读和可重复读这两种隔离级别而未提交读隔离级别总是读取最新的数据行要求很低无需使用 MVCC可串行化隔离级别需要对所有读取的行都加锁单纯使用 MVCC 无法实现
## 版本号
在封锁一节中提到加锁能解决多个事务同时执行时出现的并发一致性问题但是封锁操作代价很高而多版本并发控制采用无锁机制而是利用版本来解决并发一致性问题它的基本思想是为每个数据行维护创建
- 系统版本号是一个递增的数字每开始一个新的事务系统版本号就会自动递增
- 事务版本号事务开始时的系统版本号
@ -322,7 +324,7 @@ MVCC 在每行记录后面都保存着两个隐藏的列,用来存储两个版
MVCC 使用到的快照存储在 Undo 日志中该日志通过回滚指针把一个数据行Record的所有快照连接起来
<div align="center"> <img src="pics/e41405a8-7c05-4f70-8092-e961e28d3112.jpg" width=""/> </div><br>
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/e41405a8-7c05-4f70-8092-e961e28d3112.jpg" width=""/> </div><br>
## 实现过程
@ -536,7 +538,7 @@ Entity-Relationship有三个组成部分实体、属性、联系。
下图的 Course Student 是一对多的关系
<div align="center"> <img src="pics/1d28ad05-39e5-49a2-a6a1-a6f496adba6a.png" width="380px"/> </div><br>
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/1d28ad05-39e5-49a2-a6a1-a6f496adba6a.png" width="380px"/> </div><br>
## 表示出现多次的关系
@ -544,19 +546,19 @@ Entity-Relationship有三个组成部分实体、属性、联系。
下图表示一个课程的先修关系先修关系出现两个 Course 实体第一个是先修课程后一个是后修课程因此需要用两条线来表示这种关系
<div align="center"> <img src="pics/ac929ea3-daca-40ec-9e95-4b2fa6678243.png" width="250px"/> </div><br>
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/ac929ea3-daca-40ec-9e95-4b2fa6678243.png" width="250px"/> </div><br>
## 联系的多向性
虽然老师可以开设多门课并且可以教授多名学生但是对于特定的学生和课程只有一个老师教授这就构成了一个三元联系
<div align="center"> <img src="pics/5bb1b38a-527e-4802-a385-267dadbd30ba.png" width="350px"/> </div><br>
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/5bb1b38a-527e-4802-a385-267dadbd30ba.png" width="350px"/> </div><br>
## 表示子类
用一个三角形和两条线来连接类和子类与子类有关的属性和联系都连到子类上而与父类和子类都有关的连到父类上
<div align="center"> <img src="pics/14389ea4-8d96-4e96-9f76-564ca3324c1e.png" width="450px"/> </div><br>
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/14389ea4-8d96-4e96-9f76-564ca3324c1e.png" width="450px"/> </div><br>
# 参考资料