From f8e006f604f031550b9b58ff62247a639f05f3b2 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sun, 18 Mar 2018 14:02:08 +0800 Subject: [PATCH] auto commit --- notes/数据库系统原理.md | 25 ++++++++++-------- pics/1a851e90-0d5c-4d4f-ac54-34c20ecfb903.jpg | Bin 0 -> 17408 bytes pics/3e87de44-1c69-4365-8139-b22e8d4be347.png | Bin 0 -> 7168 bytes 3 files changed, 14 insertions(+), 11 deletions(-) create mode 100644 pics/1a851e90-0d5c-4d4f-ac54-34c20ecfb903.jpg create mode 100644 pics/3e87de44-1c69-4365-8139-b22e8d4be347.png diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md index c3f380f6..2cedcaba 100644 --- a/notes/数据库系统原理.md +++ b/notes/数据库系统原理.md @@ -21,7 +21,7 @@ * [函数依赖](#函数依赖) * [异常](#异常) * [范式](#范式) -* [十四、参考资料](#十四参考资料) +* [参考资料](#参考资料) @@ -93,13 +93,20 @@ T1 读取某个范围的数据,T2 在这个范围内插 ## 封锁类型 -排它锁 (X 锁)和共享锁 (S 锁),又称写锁和读锁。 - +- 排它锁(Exclusive),简写为 X 锁,又称写锁。 +- 共享锁(Shared),简写为 S 锁,又称读锁。 - 一个事务对数据对象 A 加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁; - 一个事务对数据对象 A 加了 S 锁,可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁,但是不能加 X 锁。 +以上加锁规定总结如下: + +

+ ## 封锁粒度 +

+ + 应该尽量只锁定需要修改的那部分数据,而不是所有的资源。锁定的数据量越少,发生锁争用的可能就越小,系统的并发程度就越高。 但是加锁需要消耗资源,锁的各种操作,包括获取锁,检查锁是否已经解除、释放锁,都会增加系统开销。因此封锁粒度越小,系统开销就越大。需要在锁开销以及数据安全性之间做一个权衡。 @@ -132,7 +139,7 @@ MySQL 中提供了两种封锁粒度:行级锁以及表级锁。 ### 2. 两段锁协议 -加锁和解锁分为两个阶段进行。两段锁是并行事务可串行化的充分条件,但不是必要条件。 +加锁和解锁分为两个阶段进行。 ```html lock-x(A)...lock-s(B)...lock-s(c)...unlock(A)...unlock(C)...unlock(B) @@ -183,12 +190,6 @@ MySQL InnoDB 采用的是两阶段锁协议。在事务执行过程中,随时 强制事务串行执行,避免幻读。 - - - - - - # 五、数据库系统概述 ## 基本术语 @@ -376,9 +377,11 @@ Entity-Relationship,有三个组成部分:实体、属性、联系。 分解成 SC(Sname, Cname, Grade) 和 ST(Sname, Tname),对于 ST,属性之间是多对多关系,无函数依赖。 -# 十四、参考资料 +# 参考资料 - 史嘉权. 数据库系统概论[M]. 清华大学出版社有限公司, 2006. - 施瓦茨. 高性能MYSQL(第3版)[M]. 电子工业出版社, 2013. - [MySQL 乐观锁与悲观锁 ](https://www.jianshu.com/p/f5ff017db62a) - [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) diff --git a/pics/1a851e90-0d5c-4d4f-ac54-34c20ecfb903.jpg b/pics/1a851e90-0d5c-4d4f-ac54-34c20ecfb903.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4809984f2b8621be9539c4751f4772d1d630237c GIT binary patch literal 17408 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 N1m@Z^_L-t;AS9|qlj z^ib*H(#%#Wl$? zv4dQEg*U=`oqMC%gv%xE@ooDx$FKYD`EM-W*AZ7uQH=Y*`P*L$mf;C044YT zxHkV=RLFe-Fy$Xd71>S{_Sm;PhXN<>h=@yPEiASJ6ud%@?!VBcN3_>j`1fpV^43;3RYcubrXY*xsmd^PePb65XsbhUQNt8r7l v@_(JvfLu2G*H2^q7l%6A6D1oy=3&)x@m$pEQP4SaTeA}6wfp}M_y7L@aB