From 827725da95403fafb7e2fce90dbc0bdfbe0bd3ec Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Sun, 8 Dec 2019 17:26:50 +0800 Subject: [PATCH] auto commit --- docs/notes/数据库系统原理.md | 65 ++++++++++--------------- notes/pics/image-20191208164808217.png | Bin 0 -> 35592 bytes notes/pics/image-20191208171445674.png | Bin 0 -> 28130 bytes notes/数据库系统原理.md | 65 ++++++++++--------------- 4 files changed, 50 insertions(+), 80 deletions(-) create mode 100644 notes/pics/image-20191208164808217.png create mode 100644 notes/pics/image-20191208171445674.png diff --git a/docs/notes/数据库系统原理.md b/docs/notes/数据库系统原理.md index a38ae975..e97faa90 100644 --- a/docs/notes/数据库系统原理.md +++ b/docs/notes/数据库系统原理.md @@ -20,10 +20,9 @@ * [可串行化(SERIALIZABLE)](#可串行化serializable) * [五、多版本并发控制](#五多版本并发控制) * [基本思想](#基本思想) - * [Undo 日志](#undo-日志) * [版本号](#版本号) - * [隐藏的列](#隐藏的列) - * [实现过程](#实现过程) + * [Undo 日志](#undo-日志) + * [ReadView](#readview) * [快照读与当前读](#快照读与当前读) * [六、Next-Key Locks](#六next-key-locks) * [Record Locks](#record-locks) @@ -257,19 +256,22 @@ SELECT ... FOR UPDATE; ## 基本思想 -在封锁一节中提到,加锁能解决多个事务同时执行时出现的并发一致性问题。但是加锁操作代价很高,并且在实际场景中读多写少,所有事务都是只是进行读操作的话就没必要进行加锁。 +在封锁一节中提到,加锁能解决多个事务同时执行时出现的并发一致性问题。在实际场景中读操作往往多于写操作,因此又引入了读写锁来避免不必要的加锁操作,例如读和读没有互斥关系。读写锁中读和写操作仍然是互斥的,而 MVCC 利用了多版本的思想,写操作更新最新的版本快照,而读操作去读旧版本快照,没有互斥关系,这一点和 CopyOnWrite 类似。 -MVCC 的读操作不需要进行加锁,并且在可重复读隔离级别下能解决脏读和不可重复读问题。它的基本思想是为每个数据行维护多个版本的快照,多个事务可以同时去操作这个数据行。 +在 MVCC 中事务的修改操作(DELETE、INSERT、UPDATE)会为数据行新增一个版本快照。 -事务的修改操作(DELETE、INSERT、UPDATE)会去修改该事务对应版本的快照。 +脏读和不可重复读最根本的原因是事务读取到其它事务未提交的修改。在事务进行读取操作时,为了解决脏读和不可重复读问题,MVCC 规定只能读取已经提交的快照。当然一个事务可以读取自身未提交的快照,这不算是脏读。 -脏读和不可重复读最根本的原因是事务读取到其它事务未提交的修改。在事务在进行读取操作时,为了解决脏读和不可重复读问题,读取的快照需要满足以下条件:快照在该事务开始之后没有被其它事务修改,否则会读取到其它事务的未提交的修改操作。 +## 版本号 + +- 系统版本号 SYS_ID:是一个递增的数字,每开始一个新的事务,系统版本号就会自动递增。 +- 事务版本号 TRX_ID :事务开始时的系统版本号。 ## Undo 日志 -MVCC 的多版本指的是多个版本的快照,这个快照存储在 Undo 日志中,该日志通过回滚指针把一个数据行的所有快照连接起来。 +MVCC 的多版本指的是多个版本的快照,快照存储在 Undo 日志中,该日志通过回滚指针 ROLL_PTR 把一个数据行的所有快照连接起来。 -例如我们在 MySQL 创建一个表 t,包含主键 id 和一个字段 x。我们先插入一个数据行,然后对该数据行执行两次操作。 +例如在 MySQL 创建一个表 t,包含主键 id 和一个字段 x。我们先插入一个数据行,然后对该数据行执行两次更新操作。 ```sql INSERT INTO t(id, x) VALUES(1, "a"); @@ -277,45 +279,28 @@ UPDATE t SET x="b" WHERE id=1; UPDATE t SET x="c" WHERE id=1; ``` -因为我们没有使用 `START TRANSACTION` 将上面的操作当成一个事务来执行,根据 MySQL 的 AUTOCOMMIT 机制,每个操作都会被当成一个事务来执行,所以上面总共涉及到三个事务。 +因为没有使用 `START TRANSACTION` 将上面的操作当成一个事务来执行,根据 MySQL 的 AUTOCOMMIT 机制,每个操作都会被当成一个事务来执行,所以上面的操作总共涉及到三个事务。快照中除了记录事务版本号 TRX_ID 和操作之外,还记录了一个 bit 的 DEL 字段,用于标记是否被删除。 -

+

-## 版本号 +INSERT、UPDATE、DELETE 操作会创建一个日志,并将事务版本号 TRX_ID 写入。DELETE 可以看成是一个特殊的 UPDATE,还会额外将 DEL 字段设置为 1。 -- 系统版本号:是一个递增的数字,每开始一个新的事务,系统版本号就会自动递增。 -- 事务版本号:事务开始时的系统版本号。 +## ReadView -## 隐藏的列 +MVCC 维护了一个 ReadView 结构,主要包含了当前系统未提交的事务列表 TRX_IDs {TRX_ID_1, TRX_ID_2, ...},还有该列表的最小值 TRX_ID_MIN 和 TRX_ID_MAX。 -MVCC 在每个数据行后面都保存着两个隐藏的列,用来存储两个版本号: +

-- 创建版本号:指示创建一个数据行的快照时的系统版本号; -- 删除版本号:如果该快照的删除版本号未定义或删除版本号大于当前事务版本号表示该快照有效。 +在进行 SELECT 操作时,根据数据行快照的 TRX_ID 与 TRX_ID_MIN 和 TRX_ID_MAX 之间的关系,从而判断数据行快照是否可以使用: -## 实现过程 +- TRX_ID < TRX_ID_MIN,表示该数据行快照时在当前所有未提交事务之前进行更改的,因此可以使用。 -以下实现过程针对可重复读隔离级别。 +- TRX_ID > TRX_ID_MAX,表示该数据行快照是在事务启动之后被更改的,因此不可使用。 +- TRX_ID_MIN <= TRX_ID <= TRX_ID_MAX,需要根据隔离级别再进行判断: + - 提交读:如果 TRX_ID 在 TRX_IDs 列表中,表示该数据行快照对应的事务还未提交,则该快照不可使用。否则表示已经提交,可以使用。 + - 可重复读:都不可以使用。因为如果可以使用的话,那么其它事务也可以读到这个数据行快照并进行修改,那么当前事务再去读这个数据行得到的值就会发生改变,也就是出现了不可重复读问题。 -因为数据行快照的创建版本号是创建数据行快照时的系统版本号,系统版本号随着创建事务而递增,所以新开始一个事务时,这个事务的系统版本号比之前的系统版本号都大,也就是比当前所有数据行快照的创建版本号都大。 - -### 1. SELECT - -多个事务必须读取到同一个数据行的快照,并且这个快照是距离现在最近的一个有效快照。但是也有例外,如果有一个事务正在修改该数据行,那么它可以读取事务本身所做的修改,而不用和其它事务的读取结果一致。 - -把没有对一个数据行做修改的事务称为 T,T 所要读取的数据行快照的创建版本号必须小于等于 T 的版本号,因为如果大于 T 的版本号,那么表示该数据行快照是其它事务的最新修改,因此不能去读取它。除此之外,T 所要读取的数据行快照的删除版本号必须是未定义或者大于 T 的版本号,因为如果小于等于 T 的版本号,那么表示该数据行快照是已经被删除的,不应该去读取它。 - -### 2. INSERT - -将当前系统版本号作为数据行快照的创建版本号。 - -### 3. DELETE - -将当前系统版本号作为数据行快照的删除版本号。 - -### 4. UPDATE - -将当前系统版本号作为更新前的数据行快照的删除版本号,并将当前系统版本号作为更新后的数据行快照的创建版本号。可以理解为先执行 DELETE 后执行 INSERT。 +在数据行快照不可使用的情况下,需要沿着 Undo Log 的回滚指针 ROLL_PTR 找到下一个快照,再进行上面的判断。 ## 快照读与当前读 @@ -329,7 +314,7 @@ SELECT * FROM table ...; ### 2. 当前读 -MVCC 其它会对数据库进行修改的操作(INSERT、UPDATE、DELETE)需要进行加锁操作,从而读取最新的数据。 +MVCC 其它会对数据库进行修改的操作(INSERT、UPDATE、DELETE)需要进行加锁操作,从而读取最新的数据。可以看到 MVCC 并不是完全不用加锁,而只是避免了 SELECT 的加锁操作。 ```sql INSERT; diff --git a/notes/pics/image-20191208164808217.png b/notes/pics/image-20191208164808217.png new file mode 100644 index 0000000000000000000000000000000000000000..36d86012834c4783b56d658e80b1927672b035ed GIT binary patch literal 35592 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̕lXQ>^t&^mo{_vS?-2MsF-4J&58G^OQQ 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 Re`;1FBcUK(Dyr}Qe*mkQYrFse literal 0 HcmV?d00001 diff --git a/notes/pics/image-20191208171445674.png b/notes/pics/image-20191208171445674.png new file mode 100644 index 0000000000000000000000000000000000000000..e1ad39a85d0f053481ba8531188276b0a17c94ff GIT binary patch literal 28130 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 ME*R>RoWB
+


-## 版本号 +INSERT、UPDATE、DELETE 操作会创建一个日志,并将事务版本号 TRX_ID 写入。DELETE 可以看成是一个特殊的 UPDATE,还会额外将 DEL 字段设置为 1。 -- 系统版本号:是一个递增的数字,每开始一个新的事务,系统版本号就会自动递增。 -- 事务版本号:事务开始时的系统版本号。 +## ReadView -## 隐藏的列 +MVCC 维护了一个 ReadView 结构,主要包含了当前系统未提交的事务列表 TRX_IDs {TRX_ID_1, TRX_ID_2, ...},还有该列表的最小值 TRX_ID_MIN 和 TRX_ID_MAX。 -MVCC 在每个数据行后面都保存着两个隐藏的列,用来存储两个版本号: +

-- 创建版本号:指示创建一个数据行的快照时的系统版本号; -- 删除版本号:如果该快照的删除版本号未定义或删除版本号大于当前事务版本号表示该快照有效。 +在进行 SELECT 操作时,根据数据行快照的 TRX_ID 与 TRX_ID_MIN 和 TRX_ID_MAX 之间的关系,从而判断数据行快照是否可以使用: -## 实现过程 +- TRX_ID < TRX_ID_MIN,表示该数据行快照时在当前所有未提交事务之前进行更改的,因此可以使用。 -以下实现过程针对可重复读隔离级别。 +- TRX_ID > TRX_ID_MAX,表示该数据行快照是在事务启动之后被更改的,因此不可使用。 +- TRX_ID_MIN <= TRX_ID <= TRX_ID_MAX,需要根据隔离级别再进行判断: + - 提交读:如果 TRX_ID 在 TRX_IDs 列表中,表示该数据行快照对应的事务还未提交,则该快照不可使用。否则表示已经提交,可以使用。 + - 可重复读:都不可以使用。因为如果可以使用的话,那么其它事务也可以读到这个数据行快照并进行修改,那么当前事务再去读这个数据行得到的值就会发生改变,也就是出现了不可重复读问题。 -因为数据行快照的创建版本号是创建数据行快照时的系统版本号,系统版本号随着创建事务而递增,所以新开始一个事务时,这个事务的系统版本号比之前的系统版本号都大,也就是比当前所有数据行快照的创建版本号都大。 - -### 1. SELECT - -多个事务必须读取到同一个数据行的快照,并且这个快照是距离现在最近的一个有效快照。但是也有例外,如果有一个事务正在修改该数据行,那么它可以读取事务本身所做的修改,而不用和其它事务的读取结果一致。 - -把没有对一个数据行做修改的事务称为 T,T 所要读取的数据行快照的创建版本号必须小于等于 T 的版本号,因为如果大于 T 的版本号,那么表示该数据行快照是其它事务的最新修改,因此不能去读取它。除此之外,T 所要读取的数据行快照的删除版本号必须是未定义或者大于 T 的版本号,因为如果小于等于 T 的版本号,那么表示该数据行快照是已经被删除的,不应该去读取它。 - -### 2. INSERT - -将当前系统版本号作为数据行快照的创建版本号。 - -### 3. DELETE - -将当前系统版本号作为数据行快照的删除版本号。 - -### 4. UPDATE - -将当前系统版本号作为更新前的数据行快照的删除版本号,并将当前系统版本号作为更新后的数据行快照的创建版本号。可以理解为先执行 DELETE 后执行 INSERT。 +在数据行快照不可使用的情况下,需要沿着 Undo Log 的回滚指针 ROLL_PTR 找到下一个快照,再进行上面的判断。 ## 快照读与当前读 @@ -329,7 +314,7 @@ SELECT * FROM table ...; ### 2. 当前读 -MVCC 其它会对数据库进行修改的操作(INSERT、UPDATE、DELETE)需要进行加锁操作,从而读取最新的数据。 +MVCC 其它会对数据库进行修改的操作(INSERT、UPDATE、DELETE)需要进行加锁操作,从而读取最新的数据。可以看到 MVCC 并不是完全不用加锁,而只是避免了 SELECT 的加锁操作。 ```sql INSERT;