MVCC多版本并发控制笔记

1. 事务

  • 事务的本质是将多个步骤捆绑为一个"全有或全无"的操作
  • 步骤之间的中间状态对于其他并发事务是不可见的
  • 如果某些故障导致事务无法完成,则所有的步骤都不会影响数据库

2. 隔离级别

脏读(read uncommitted):不管事务处于什么状态,都可以被其他事务看到;

读已提交(read committed):一旦事务提交,才对其他事务课件;

repeatable read(可重复读):在一个事务中,同样的SQL查到的数据始终是一样的

serializable(串行):每次顺序是一样的

3. mvcc是什么

  • 每个写操作都会创建数据项目的新版本,同时保留旧版本;
  • 这种方法允许greenplum在读写同时进行的情况下仍然能提高并发特性;
  • MVCC最大的特点是读操作不会阻塞写操作,写操作也不会阻塞读操作;
    • 每次update一个数据,不会把旧数据删除,只会写一份新数据进来,然后把旧的数据进行标记一个版本,这样子的话读操作发生在旧版本上,写操作发生在新版本。

4. Heap表页面布局

MVCC多版本并发控制笔记_第1张图片

xmin:创建tuple的事务id,比如inster

xmax:删除这个tuple的事务id,比如update、delete

cid:记录这个tuple是这个事务内的第几条命令创建的

ctid:二元组,前一部分是配置id,后一部分是这个tuple的下标

5. 快照

Xmin:所有小于xmin的事务都已经提交

Running:正在执行的事务列表

Xmax:所有大于等于xmax的事务都未提交

这里指的是快照里面的Xmin与Xmax

  • mvcc的快照用来控制哪个元组对于当前查询可见;
  • 在read committed隔离级别,每个查询开始时生成快照。在repeatable read隔离级别,在每个事务开始时生成快照;
  • 快照理论上是一个正在运行的事务列表;
  • greenplum使用快照判断一个事务是否已提交;

5.1. 快照可见性

MVCC多版本并发控制笔记_第2张图片

5.2. 标记committed or invalid

MVCC多版本并发控制笔记_第3张图片

5.3. 行锁

标志位heap_xmax_excl_lock用来表示xmax是用作行锁而不是表示删除

MVCC多版本并发控制笔记_第4张图片

6. 总结

xmin:创建元组的事务ID

xmax:使元组过期的事务ID,由update或delete语句设置。在某些情况下,用作行锁。

cmin/cmax:用于标记事务内的可见性。如果在一个事务内先创建再过期,则使用combo command id。

7. MVCC的清理需求

  • 在更新元组时创建一个新的元组,所以旧的元组需要清理
  • 在删除元组时,只会标记xmax,不会立即删除元组
  • 失败的事务所创建的元组

何时执行清理操作?

  • 在查询操作访问到某个页面时,会清理这个元组
  • 使用vacuum手动进行清理

清理哪些内容?

  • tuple(元组)
  • item(元组指针)
  • indexs(索引项)

MVCC多版本并发控制笔记_第5张图片

清理总结

  • 清理只发生在对于任何执行中的事务都不可见的tuple上
  • HOT(heap only tuple)发生在处于单个页面,并有相同的索引值的tuple上
  • 多数的清理工作由单页清理操作完成,但是单页清理只涉及heap page
  • vacuum则会进行更加彻底的清理,包括tuple item index

你可能感兴趣的:(Greenplum,数据库)