1. 事务
- 事务的本质是将多个步骤捆绑为一个"全有或全无"的操作
- 步骤之间的中间状态对于其他并发事务是不可见的
- 如果某些故障导致事务无法完成,则所有的步骤都不会影响数据库
2. 隔离级别
脏读(read uncommitted):不管事务处于什么状态,都可以被其他事务看到;
读已提交(read committed):一旦事务提交,才对其他事务课件;
repeatable read(可重复读):在一个事务中,同样的SQL查到的数据始终是一样的
serializable(串行):每次顺序是一样的
3. mvcc是什么
- 每个写操作都会创建数据项目的新版本,同时保留旧版本;
- 这种方法允许greenplum在读写同时进行的情况下仍然能提高并发特性;
- MVCC最大的特点是读操作不会阻塞写操作,写操作也不会阻塞读操作;
-
- 每次update一个数据,不会把旧数据删除,只会写一份新数据进来,然后把旧的数据进行标记一个版本,这样子的话读操作发生在旧版本上,写操作发生在新版本。
4. Heap表页面布局
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. 快照可见性
5.2. 标记committed or invalid
5.3. 行锁
标志位heap_xmax_excl_lock用来表示xmax是用作行锁而不是表示删除
6. 总结
xmin:创建元组的事务ID
xmax:使元组过期的事务ID,由update或delete语句设置。在某些情况下,用作行锁。
cmin/cmax:用于标记事务内的可见性。如果在一个事务内先创建再过期,则使用combo command id。
7. MVCC的清理需求
- 在更新元组时创建一个新的元组,所以旧的元组需要清理
- 在删除元组时,只会标记xmax,不会立即删除元组
- 失败的事务所创建的元组
何时执行清理操作?
- 在查询操作访问到某个页面时,会清理这个元组
- 使用vacuum手动进行清理
清理哪些内容?
- tuple(元组)
- item(元组指针)
- indexs(索引项)
清理总结
- 清理只发生在对于任何执行中的事务都不可见的tuple上
- HOT(heap only tuple)发生在处于单个页面,并有相同的索引值的tuple上
- 多数的清理工作由单页清理操作完成,但是单页清理只涉及heap page
- vacuum则会进行更加彻底的清理,包括tuple item index