diff --git a/notes/pics/lock-protocol-2.png b/notes/pics/lock-protocol-2.png new file mode 100644 index 00000000..27bdabbd Binary files /dev/null and b/notes/pics/lock-protocol-2.png differ diff --git a/notes/pics/readview.png b/notes/pics/readview.png new file mode 100644 index 00000000..29b01451 Binary files /dev/null and b/notes/pics/readview.png differ diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md index 8f6b28b9..ec7b72c6 100644 --- a/notes/数据库系统原理.md +++ b/notes/数据库系统原理.md @@ -189,7 +189,7 @@ MySQL 中提供了两种封锁粒度:行级锁以及表级锁。 可以解决读脏数据问题,因为如果一个事务在对数据 A 进行修改,根据 1 级封锁协议,会加 X 锁,那么就不能再加 S 锁了,也就是不会读入数据。 -

+

**三级封锁协议** @@ -291,7 +291,7 @@ INSERT、UPDATE、DELETE 操作会创建一个日志,并将事务版本号 TRX MVCC 维护了一个 ReadView 结构,主要包含了创建 ReadView 时系统中未提交的事务列表 TRX_IDs {TRX_ID_1, TRX_ID_2, ...},该列表的最小值 TRX_ID_MIN,以及下一个将要分配的事务 ID TRX_ID_MAX。 -

+

在进行 SELECT 操作时,根据数据行快照的 TRX_ID 与 TRX_ID_MIN 和 TRX_ID_MAX 之间的关系,从而判断数据行快照是否可以使用: diff --git a/tools/diagram/src/lock-protocol-2.svg b/tools/diagram/src/lock-protocol-2.svg new file mode 100644 index 00000000..f95291b4 --- /dev/null +++ b/tools/diagram/src/lock-protocol-2.svg @@ -0,0 +1,71 @@ + + + + + + + + + 二级封锁协议 + CyC + T1 + T2 + + + + + + + lock-x A + + + + read A=10 + + + + write A=20 + + + + rollback + + + + unlock-x A + + + + + + + + + + lock-s A + + wait + + + obtain + + + + read A=10 + + + + unlock-s A + + + + diff --git a/tools/diagram/src/readview.svg b/tools/diagram/src/readview.svg new file mode 100644 index 00000000..fb0eb599 --- /dev/null +++ b/tools/diagram/src/readview.svg @@ -0,0 +1,56 @@ + + + + + + + + + ReadView + CyC + + + TRX_IDs(创建 ReadView 时未提交的事务) + + + + TRX_ID_1 + + + TRX_ID_2 + + + TRX_ID_3 + + + + 下一个 ID + + + + + + + + + 事务 ID + + + TRX_ID_MIN + TRX_ID_MAX + + 可以使用 + 在 TRX_IDs 中则不可使用, + 否则可以使用 + 不可使用 +