From ea3428808b9e19548204bd63a30474c2acabb11f Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Thu, 22 Mar 2018 11:51:35 +0800 Subject: [PATCH] auto commit --- notes/数据库系统原理.md | 36 +++++++++++++++--- pics/e41405a8-7c05-4f70-8092-e961e28d3112.jpg | Bin 0 -> 14336 bytes 2 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 pics/e41405a8-7c05-4f70-8092-e961e28d3112.jpg diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md index a41f245f..7dae277d 100644 --- a/notes/数据库系统原理.md +++ b/notes/数据库系统原理.md @@ -10,14 +10,15 @@ * [封锁粒度](#封锁粒度) * [封锁协议](#封锁协议) * [四、隔离级别](#四隔离级别) -* [五、关系数据库设计理论](#五关系数据库设计理论) +* [五、多版本并发控制](#五多版本并发控制) +* [六、关系数据库设计理论](#六关系数据库设计理论) * [函数依赖](#函数依赖) * [异常](#异常) * [范式](#范式) -* [六、数据库系统概述](#六数据库系统概述) +* [七、数据库系统概述](#七数据库系统概述) * [基本术语](#基本术语) * [数据库的三层模式和两层映像](#数据库的三层模式和两层映像) -* [七、关系数据库建模](#七关系数据库建模) +* [八、关系数据库建模](#八关系数据库建模) * [ER 图](#er-图) * [约束](#约束) * [参考资料](#参考资料) @@ -178,7 +179,29 @@ lock-x(A)...unlock(A)...lock-s(B)...unlock(B)...lock-s(c)...unlock(C)... | 可重复读 | NO | NO | YES | | 可串行化 | NO | NO | NO | -# 五、关系数据库设计理论 +# 五、多版本并发控制 + +(未完待续) + +(Multi-Version Concurrency Control, MVCC)是 MySQL 的 InnoDB 存储引擎实现的一种并发控制方式,通过保存数据在某个时间点的快照,让多个事务对同一个数据的读取结果是一致的。 + +MVCC 可以工作在提交读和可重复读两个隔离级别下,因为未提交读总是读取最新的数据行,可串行化会对所有读取的行都加锁。 + + **版本号是一个**
+ +版本是一个递增的数字,每开始一个新的事务,系统版本号就会自动递增。 + +事务的版本号为事务开始时的系统版本号。 + +InooDB 的 MVCC 在每行记录后面都保存着两个隐藏的列,一个列保存着创建的版本号,一个列保存着删除的版本号。 + + **Undo 日志**
+ +MVCC 实现使用到的快照其实是 Undo 日志,它通过回滚指针把一个数据行(Record)的所有版本连接起来。 + +

+ +# 六、关系数据库设计理论 ## 函数依赖 @@ -305,7 +328,7 @@ Sname, Sdept 和 Manme 都函数依赖于 Sno,而部分依赖于键码。当 可以分解成 SC(Sname, Cname, Grade) 和 ST(Sname, Tname),对于 ST,属性之间是多对多关系,无函数依赖。 -# 六、数据库系统概述 +# 七、数据库系统概述 ## 基本术语 @@ -347,7 +370,7 @@ Sname, Sdept 和 Manme 都函数依赖于 Sno,而部分依赖于键码。当 把模式的全局逻辑结构和内模式的物理结构联系起来,该映像可以保证数据和应用程序的物理独立性。 -# 七、关系数据库建模 +# 八、关系数据库建模 ## ER 图 @@ -416,3 +439,4 @@ Entity-Relationship,有三个组成部分:实体、属性、联系。 - [The Nightmare of Locking, Blocking and Isolation Levels!](https://www.slideshare.net/brshristov/the-nightmare-of-locking-blocking-and-isolation-levels-46391666) - [三级模式与两级映像](http://blog.csdn.net/d2457638978/article/details/48783923) - [Database Normalization and Normal Forms with an Example](https://aksakalli.github.io/2012/03/12/database-normalization-and-normal-forms-with-an-example.html) +- [The basics of the InnoDB undo logging and history system](https://blog.jcole.us/2014/04/16/the-basics-of-the-innodb-undo-logging-and-history-system/) diff --git a/pics/e41405a8-7c05-4f70-8092-e961e28d3112.jpg b/pics/e41405a8-7c05-4f70-8092-e961e28d3112.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7fef7ba5c04dd185a0798ae113327aace5108c3d GIT binary patch literal 14336 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 literal 0 HcmV?d00001