From ede21895355ecb2b421b018ea528d33ab291832e Mon Sep 17 00:00:00 2001
From: CyC2018 <1029579233@qq.com>
Date: Fri, 9 Mar 2018 14:22:11 +0800
Subject: [PATCH] auto commit
---
notes/数据库系统原理.md | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md
index a2315270..0fb4a9b1 100644
--- a/notes/数据库系统原理.md
+++ b/notes/数据库系统原理.md
@@ -100,7 +100,7 @@ T1 读入某个数据,T2 对该数据做了修改,如
## 可串行化(SERIALIXABLE)
-强制事务串行执行,避免幻行的出现。
+强制事务串行执行,避免幻读。
# 可串行化调度
@@ -108,7 +108,7 @@ T1 读入某个数据,T2 对该数据做了修改,如
# 封锁类型
-排它锁 (X 锁 ),共享锁 (S 锁 )
+排它锁 (X 锁),共享锁 (S 锁)
一个事务 T 对数据对象 A 加了 X 锁,T 就可以对 A 进行读取和更新。加锁期间其它事务不能对数据对象 A 加任何其它锁;
@@ -124,26 +124,26 @@ T1 读入某个数据,T2 对该数据做了修改,如
## 三级封锁协议
-(1) 1 级封锁协议
+
+
+**1 级封锁协议**
事务 T 要修改数据 A 时必须加 X 锁,直到事务结束才释放锁。
可以解决丢失修改问题;
-(2) 2 级封锁协议
+**2 级封锁协议**
在 1 级的基础上,要求读取数据 A 时必须加 S 锁,读取完马上释放 S 锁。
可以解决读脏数据问题,因为如果一个事务在对数据 A 进行修改,根据 1 级封锁协议,会加 X 锁,那么就不能再加 S 锁了,也就是不会读入数据。
-(3) 3 级封锁协议
+**3 级封锁协议**
在 2 级的基础上,要求读取数据 A 时必须加 S 锁,直到事务结束了才能释放 S 锁。
可以解决不可重复读的问题,因为读 A 时,其它事务不能对 A 加 X 锁,从而避免了在读的期间数据发生改变。
-
-
## 两段锁协议
加锁和解锁分为两个阶段进行。两段锁是并行事务可串行化的充分条件,但不是必要条件。
@@ -164,7 +164,7 @@ Java synchronized 就属于悲观锁的一种实现,每次线程要修改数
假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
-Java JUC 中的 atomic 包就是乐观锁的一种实现,AtomicInteger 通过 CAS(Compare And Set)操作实现线程安全的自增。
+Java JUC 中的 Atomic 包就是乐观锁的一种实现,AtomicInteger 通过 CAS(Compare And Set)操作实现线程安全的自增操作。
乐观锁有两种实现方式,数据版本和时间戳。它们都需要在数据库表中增加一个字段,使用这个字段来判断数据是否过期。例如,数据版本实现方式中,需要在数据库表中增加一个数字类型的 version 字段,当读取数据时,将 version 字段的值一同读出。随后数据每更新一次,对此 version 值加 1。当提交更新的时候,判断读出的 version 和数据库表中的 version 是否一致,如果一致,则予以更新;否则认为是过期数据。
@@ -174,7 +174,7 @@ MySQL InnoDB 采用的是两阶段锁协议。在事务执行过程中,随时
另外,InnoDB 也支持通过特定的语句进行显示锁定,这些语句不属于 SQL 规范:
-- ELECT ... LOCK IN SHARE MODE
+- SELECT ... LOCK IN SHARE MODE
- SELECT ... FOR UPDATE
# 范式