From 45322f86551266a91fdb63a4d69f296a6544ca60 Mon Sep 17 00:00:00 2001 From: rentc Date: Fri, 29 Jul 2022 15:36:21 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E2=80=9Cadd=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\344\271\240\346\200\273\347\273\223.md" | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 "content/zh/post/Rentc/openguass-\344\272\213\345\212\241\347\256\241\347\220\206\345\222\214MVVC\345\255\246\344\271\240\346\200\273\347\273\223.md" diff --git "a/content/zh/post/Rentc/openguass-\344\272\213\345\212\241\347\256\241\347\220\206\345\222\214MVVC\345\255\246\344\271\240\346\200\273\347\273\223.md" "b/content/zh/post/Rentc/openguass-\344\272\213\345\212\241\347\256\241\347\220\206\345\222\214MVVC\345\255\246\344\271\240\346\200\273\347\273\223.md" new file mode 100644 index 00000000..3d8acfa9 --- /dev/null +++ "b/content/zh/post/Rentc/openguass-\344\272\213\345\212\241\347\256\241\347\220\206\345\222\214MVVC\345\255\246\344\271\240\346\200\273\347\273\223.md" @@ -0,0 +1,40 @@ + +# 第三周学习总结 + +## 一.事务 + +## 1.事务的定义 +访问并可能更新数据库中各种[数据项](https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E9%A1%B9/3227309)的一个程序[执行单元](https://baike.baidu.com/item/%E6%89%A7%E8%A1%8C%E5%8D%95%E5%85%83/22689638) + +## 1 事务的属性 +原子性(Atomicity):同一个事务下,事务是不可被分割的
一致性(Consistency):一致性,事务的的前后数据的完整性需一致
隔离性(Isolation):不同事务之间相互隔离,互不影响
持久性(Durability):事务一旦执行,数据库的变化就是永久性的 + +## 2 事务的隔离级别 +![](https://cdn.nlark.com/yuque/0/2022/png/29767082/1659077473013-72ed1da1-8b33-4379-b631-ae64edc40a75.png#)
脏读:一个事务还未提交的时候,另一个事务读到了该事务中未提交的数据
不可重复读:同一个事务中,两次读取的结果,由于其他事务的提交,导致读取结果不一致
幻读:事务A进行某条件下的数据变更操作,事务B对相同搜索条件的数据发生了数据新增的操作,导致事务A提交以后仿佛发生了"诡异",有数据没有被修改
可重复读与幻读的区别:
不可重复读,是同一个事务中,两次读取操作导致数据不一致,幻读指的是事务不是独立执行时发生的一种现象,例如,第一个事务对全部数据做修改,第二个事务在第一个事务执行期间,新增了数据,当第一个事务提交以后发现有数据没有被修改,如同发生了幻觉 + +## 二.Mvvc + +## **1.openGauss中MVCC的实现**思路 + +- 定义多版本的数据——使用元组头部信息的字段来标示元组的版本号 +- 定义数据的有效性、可见性、可更新性——通过当前的事务快照和对应元组的版本号判断 +- 实现不同的数据库隔离级别——通过在不同时机获取快照实现 + +## 2.基本概念 + +### 1.事务号 +当事务开始(执行begin第一条命令时),事务管理器会为该事务分配一个txid(transaction id)作为唯一标识符。txid是一个32位无符号整数,取值空间大小约42亿(2^32-1)。
txid可通过txid_current()函数获取
![](https://cdn.nlark.com/yuque/0/2022/png/29767082/1659077473678-d72dd5d7-c734-4ffd-8408-24a308f6adae.png#) + +### 3 其中与MVCC相关的重要信息 +t_xmin:保存插入该元组的事务txid(该元组由哪个事务插入)
t_xmax:保存更新或删除该元组的事务txid。若该元组尚未被删除或更新,则t_xmax=0,即invalid
t_cid:保存命令标识(command id,cid),指在该事务中,执行当前命令之前还执行过几条sql命令(从0开始计算)
t_ctid:一个指针,保存指向自身或新元组的元组的标识符(tid) + + + +### 4 事务实现 +每行上有xmin和xmax两个系统字段
当插入一行数据时,将这行上的xmin设置为当前的事务id,而xmax设置为0
当更新一行时,实际上是插入新行,把旧行上的xmax设置为当前事务id,新插入行的xmin设置为当前事务id,新行的xmax设置为0
当删除一行时,把当前行的xmax设置为当前事务id
当读到一行时,查询xmin和xmax对应的事务状态是否是已提交还是回滚了, 就能判断出此行对当前行是否是可见。
![](https://cdn.nlark.com/yuque/0/2022/png/29767082/1659077474190-f784237e-0e83-4988-9d5b-d8c83cda9106.png#)
查看指定表对应的page header内容 + +![](https://cdn.nlark.com/yuque/0/2022/png/29767082/1659077474889-483b9f2e-ae76-43ec-9362-728079680ff2.png#) + +### 4.事务ID的增长 +1.事务ID不能无限增长
2.txid到最大值,又会从最小值3开始
0: 无效事务ID
1: 表示系统表初使化时的事务ID,比任务普通的事务ID都旧。
2:冻结的事务ID,比任务普通的事务ID都旧。
同一个数据库中,存在的最旧和最新两个事务之间的年龄允许的最多是2^31,即20亿。
![](https://cdn.nlark.com/yuque/0/2022/png/29767082/1659077475269-01d834dc-ad06-49a8-b39e-8be48d527b62.png#)
可用的有效最小事务ID为3。VACUUM时将所有已提交的事务ID均设置为2,即frozon。之后所有的事务都比frozon事务新,因此VACUUM之前的所有已提交的数据都对之后的事务可见。通过这种方式实现了事务ID的循环利用。 + -- Gitee From 659e1c5fb033716effb0f496f845e0f873cc2360 Mon Sep 17 00:00:00 2001 From: rentc Date: Fri, 29 Jul 2022 17:02:16 +0800 Subject: [PATCH 2/3] add --- ...5\246\344\271\240\346\200\273\347\273\223.md" | 10 ++++++++++ content/zh/post/Rentc/title/title.jpg | Bin 0 -> 5692 bytes 2 files changed, 10 insertions(+) create mode 100644 "content/zh/post/Rentc/openGauss-\344\272\213\345\212\241\347\256\241\347\220\206\345\222\214MVVC\345\255\246\344\271\240\346\200\273\347\273\223.md" create mode 100644 content/zh/post/Rentc/title/title.jpg diff --git "a/content/zh/post/Rentc/openGauss-\344\272\213\345\212\241\347\256\241\347\220\206\345\222\214MVVC\345\255\246\344\271\240\346\200\273\347\273\223.md" "b/content/zh/post/Rentc/openGauss-\344\272\213\345\212\241\347\256\241\347\220\206\345\222\214MVVC\345\255\246\344\271\240\346\200\273\347\273\223.md" new file mode 100644 index 00000000..cbed0981 --- /dev/null +++ "b/content/zh/post/Rentc/openGauss-\344\272\213\345\212\241\347\256\241\347\220\206\345\222\214MVVC\345\255\246\344\271\240\346\200\273\347\273\223.md" @@ -0,0 +1,10 @@ ++++ +title = "openGauss社区入门(openguass-事务管理和MVVC学习总结)" +date = "2022-07-29" +tags = ["openGauss社区开发入门"] +archives = "2022-07" +author = "rentc" +summary = "openGauss社区开发入门" +img = "/zh/post/Rentc/title/title.jpg" +times = "16:50" ++++ diff --git a/content/zh/post/Rentc/title/title.jpg b/content/zh/post/Rentc/title/title.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0c73236ddad08cd564c15afcee9d351a9a614fda GIT binary patch literal 5692 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 D8G7Wz literal 0 HcmV?d00001 -- Gitee From 29d3d8cf8773ed186758e6d382c50e0895370f65 Mon Sep 17 00:00:00 2001 From: rentc Date: Fri, 29 Jul 2022 17:46:26 +0800 Subject: [PATCH 3/3] add my blog --- ...46\344\271\240\345\260\217\347\273\223.md" | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 "content/zh/post/Rentc1/openguass-\344\272\213\345\212\241\347\256\241\347\220\206\345\222\214MVVC\345\255\246\344\271\240\345\260\217\347\273\223.md" diff --git "a/content/zh/post/Rentc1/openguass-\344\272\213\345\212\241\347\256\241\347\220\206\345\222\214MVVC\345\255\246\344\271\240\345\260\217\347\273\223.md" "b/content/zh/post/Rentc1/openguass-\344\272\213\345\212\241\347\256\241\347\220\206\345\222\214MVVC\345\255\246\344\271\240\345\260\217\347\273\223.md" new file mode 100644 index 00000000..beff06eb --- /dev/null +++ "b/content/zh/post/Rentc1/openguass-\344\272\213\345\212\241\347\256\241\347\220\206\345\222\214MVVC\345\255\246\344\271\240\345\260\217\347\273\223.md" @@ -0,0 +1,39 @@ ++++
title = "openGauss社区入门(openguass-事务管理和MVVC学习总结)"
date = "2022-07-29"
tags = ["openGauss社区开发入门"]
archives = "2022-07"
author = "rentc"
summary = "openGauss社区开发入门"
img = "/zh/post/Rentc1/title/title.jpg"
times = "16:50"
+++ + +## 一.事务 + +## 1.事务的定义 +访问并可能更新数据库中各种[数据项](https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E9%A1%B9/3227309)的一个程序[执行单元](https://baike.baidu.com/item/%E6%89%A7%E8%A1%8C%E5%8D%95%E5%85%83/22689638) + +## 1 事务的属性 +原子性(Atomicity):同一个事务下,事务是不可被分割的
一致性(Consistency):一致性,事务的的前后数据的完整性需一致
隔离性(Isolation):不同事务之间相互隔离,互不影响
持久性(Durability):事务一旦执行,数据库的变化就是永久性的 + +## 2 事务的隔离级别 +![](https://cdn.nlark.com/yuque/0/2022/png/29767082/1659077473013-72ed1da1-8b33-4379-b631-ae64edc40a75.png#crop=0&crop=0&crop=1&crop=1&id=nIfMW&originHeight=164&originWidth=514&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
脏读:一个事务还未提交的时候,另一个事务读到了该事务中未提交的数据
不可重复读:同一个事务中,两次读取的结果,由于其他事务的提交,导致读取结果不一致
幻读:事务A进行某条件下的数据变更操作,事务B对相同搜索条件的数据发生了数据新增的操作,导致事务A提交以后仿佛发生了"诡异",有数据没有被修改
可重复读与幻读的区别:
不可重复读,是同一个事务中,两次读取操作导致数据不一致,幻读指的是事务不是独立执行时发生的一种现象,例如,第一个事务对全部数据做修改,第二个事务在第一个事务执行期间,新增了数据,当第一个事务提交以后发现有数据没有被修改,如同发生了幻觉 + +## 二.Mvvc + +## **1.openGauss中MVCC的实现**思路 + +- 定义多版本的数据——使用元组头部信息的字段来标示元组的版本号 +- 定义数据的有效性、可见性、可更新性——通过当前的事务快照和对应元组的版本号判断 +- 实现不同的数据库隔离级别——通过在不同时机获取快照实现 + +## 2.基本概念 + +### 1.事务号 +当事务开始(执行begin第一条命令时),事务管理器会为该事务分配一个txid(transaction id)作为唯一标识符。txid是一个32位无符号整数,取值空间大小约42亿(2^32-1)。
txid可通过txid_current()函数获取
![](https://cdn.nlark.com/yuque/0/2022/png/29767082/1659077473678-d72dd5d7-c734-4ffd-8408-24a308f6adae.png#crop=0&crop=0&crop=1&crop=1&id=IY3me&originHeight=172&originWidth=468&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=) + +### 3 其中与MVCC相关的重要信息 +t_xmin:保存插入该元组的事务txid(该元组由哪个事务插入)
t_xmax:保存更新或删除该元组的事务txid。若该元组尚未被删除或更新,则t_xmax=0,即invalid
t_cid:保存命令标识(command id,cid),指在该事务中,执行当前命令之前还执行过几条sql命令(从0开始计算)
t_ctid:一个指针,保存指向自身或新元组的元组的标识符(tid) + + + +### 4 事务实现 +每行上有xmin和xmax两个系统字段
当插入一行数据时,将这行上的xmin设置为当前的事务id,而xmax设置为0
当更新一行时,实际上是插入新行,把旧行上的xmax设置为当前事务id,新插入行的xmin设置为当前事务id,新行的xmax设置为0
当删除一行时,把当前行的xmax设置为当前事务id
当读到一行时,查询xmin和xmax对应的事务状态是否是已提交还是回滚了, 就能判断出此行对当前行是否是可见。
![](https://cdn.nlark.com/yuque/0/2022/png/29767082/1659077474190-f784237e-0e83-4988-9d5b-d8c83cda9106.png#crop=0&crop=0&crop=1&crop=1&id=V06aP&originHeight=288&originWidth=1287&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
查看指定表对应的page header内容 + +![](https://cdn.nlark.com/yuque/0/2022/png/29767082/1659077474889-483b9f2e-ae76-43ec-9362-728079680ff2.png#crop=0&crop=0&crop=1&crop=1&id=Mu1WX&originHeight=702&originWidth=893&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=) + +### 4.事务ID的增长 +1.事务ID不能无限增长
2.txid到最大值,又会从最小值3开始
0: 无效事务ID
1: 表示系统表初使化时的事务ID,比任务普通的事务ID都旧。
2:冻结的事务ID,比任务普通的事务ID都旧。
同一个数据库中,存在的最旧和最新两个事务之间的年龄允许的最多是2^31,即20亿。
![](https://cdn.nlark.com/yuque/0/2022/png/29767082/1659077475269-01d834dc-ad06-49a8-b39e-8be48d527b62.png#crop=0&crop=0&crop=1&crop=1&id=yFHJ2&originHeight=407&originWidth=452&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
可用的有效最小事务ID为3。VACUUM时将所有已提交的事务ID均设置为2,即frozon。之后所有的事务都比frozon事务新,因此VACUUM之前的所有已提交的数据都对之后的事务可见。通过这种方式实现了事务ID的循环利用。 + -- Gitee