diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md index 2e84b5af..ebea2700 100644 --- a/notes/数据库系统原理.md +++ b/notes/数据库系统原理.md @@ -6,24 +6,25 @@ * [问题](#问题) * [解决方法](#解决方法) * [三、封锁](#三封锁) - * [封锁类型](#封锁类型) * [封锁粒度](#封锁粒度) + * [封锁类型](#封锁类型) * [封锁协议](#封锁协议) * [四、隔离级别](#四隔离级别) * [五、多版本并发控制](#五多版本并发控制) * [版本号](#版本号) * [Undo 日志](#undo-日志) * [实现过程](#实现过程) -* [六、关系数据库设计理论](#六关系数据库设计理论) +* [六、间隙锁](#六间隙锁) +* [七、关系数据库设计理论](#七关系数据库设计理论) * [函数依赖](#函数依赖) * [异常](#异常) * [范式](#范式) -* [七、数据库系统概述](#七数据库系统概述) +* [八、数据库系统概述](#八数据库系统概述) * [基本术语](#基本术语) * [数据库的三层模式和两层映像](#数据库的三层模式和两层映像) -* [八、关系数据库建模](#八关系数据库建模) +* [九、关系数据库建模](#九关系数据库建模) * [ER 图](#er-图) - * [约束](#约束) + * [十、约束](#十约束) * [参考资料](#参考资料) @@ -94,17 +95,6 @@ T1 读取某个范围的数据,T2 在这个范围内插 # 三、封锁 -## 封锁类型 - -- 排它锁(Exclusive),简写为 X 锁,又称写锁。 -- 共享锁(Shared),简写为 S 锁,又称读锁。 -- 一个事务对数据对象 A 加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁。 -- 一个事务对数据对象 A 加了 S 锁,可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁,但是不能加 X 锁。 - -以上加锁规定总结如下: - -

- ## 封锁粒度

@@ -115,6 +105,43 @@ T1 读取某个范围的数据,T2 在这个范围内插 MySQL 中提供了两种封锁粒度:行级锁以及表级锁。 +## 封锁类型 + +### 1. 排它锁与共享锁 + +- 排它锁(Exclusive),简写为 X 锁,又称写锁。 +- 共享锁(Shared),简写为 S 锁,又称读锁。 + +有以下两个规定: + +1. 一个事务对数据对象 A 加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁。 +2. 一个事务对数据对象 A 加了 S 锁,可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁,但是不能加 X 锁。 + +锁的兼容关系如下: + +| - | X | S | +| :--: | :--: | :--: | +|X|YES|No| +|S|No| No| + +### 2. 意向锁 + +意向锁(Intention Locks)可以支持多粒度封锁,它在原来的 X/S 锁之上引入了 IX/IS,用来表示一个事务想要在某个数据对象上加 X 锁或 S 锁。 + +有以下两个规定: + +1. 一个事务在获得某个数据行对象的 S 锁之前,必须先获得 IS 锁或者更强的锁; +2. 一个事务在获得某个数据行对象的 X 锁之前,必须先获得 IX 锁。 + +各种锁的兼容关系如下: + +| - | X | IX | S | IS | +| :--: | :--: | :--: | :--: | :--: | +|X |NO |NO |NO | NO| +|IX |NO |YES|NO | YES| +|S |NO |NO |YES| YES| +|IS |NO |YES|YES| YES| + ## 封锁协议 ### 1. 三级封锁协议 @@ -230,7 +257,9 @@ InnoDB 的 MVCC 使用到的快照存储在 Undo 日志中,该日志通过回 将系统版本号作为更新后的数据行快照的创建版本号,同时将系统版本号作为作为更新前的数据行快照的删除版本号。可以理解为新执行 DELETE 后执行 INSERT。 -# 六、关系数据库设计理论 +# 六、间隙锁 + +# 七、关系数据库设计理论 ## 函数依赖 @@ -357,7 +386,7 @@ Sname, Sdept 和 Manme 都函数依赖于 Sno,而部分依赖于键码。当 可以分解成 SC(Sname, Cname, Grade) 和 ST(Sname, Tname),对于 ST,属性之间是多对多关系,无函数依赖。 -# 七、数据库系统概述 +# 八、数据库系统概述 ## 基本术语 @@ -399,7 +428,7 @@ Sname, Sdept 和 Manme 都函数依赖于 Sno,而部分依赖于键码。当 把模式的全局逻辑结构和内模式的物理结构联系起来,该映像可以保证数据和应用程序的物理独立性。 -# 八、关系数据库建模 +# 九、关系数据库建模 ## ER 图 @@ -435,7 +464,7 @@ Entity-Relationship,有三个组成部分:实体、属性、联系。

-## 约束 +## 十、约束 ### 1. 键码 @@ -463,6 +492,7 @@ Entity-Relationship,有三个组成部分:实体、属性、联系。 - 史嘉权. 数据库系统概论[M]. 清华大学出版社有限公司, 2006. - 施瓦茨. 高性能MYSQL(第3版)[M]. 电子工业出版社, 2013. +- [The InnoDB Storage Engine](https://dev.mysql.com/doc/refman/5.7/en/innodb-storage-engine.html) - [Transaction isolation levels](https://www.slideshare.net/ErnestoHernandezRodriguez/transaction-isolation-levels) - [Concurrency Control](http://scanftree.com/dbms/2-phase-locking-protocol) - [The Nightmare of Locking, Blocking and Isolation Levels!](https://www.slideshare.net/brshristov/the-nightmare-of-locking-blocking-and-isolation-levels-46391666)