本文主要是介绍数据库 06-03 时间戳,多版本MVCC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
01.什么是时间戳
“时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。
02.用时间戳实现调度
定义
数据库给予一个事务一个时间戳(具有唯一性)
数据库两种定义时间戳的方法:
无论如何定义时间戳,都会按照时间来进行调度的串行化
每个数据项有两个重要的时间戳:
时间戳排序协定
用要访问的数据项的时间戳对事务读写方法:
这里比较的都是用的事务最开始被系统设定的时间戳,成功的值也是事务的时间戳的值,不是读写方法过程的那一刻的时间戳
事务读方法用数据项的写的时间戳:
事务写方法用数据项的读和写的时间戳:
事务如果回滚,属于事务的时间戳会重置:
例子
时间戳排序的缺点:
可以保证调度串行化,但是由于长事务的IO时间长,会反复回滚。
改进方法:
1.保证事务写入数据项A时候,数据项A的读时间戳绝对不会大于现在这个时刻的时间戳,万一事务就是刚刚创建的呢
2
3.这个是可恢复调度(已经读了)
可恢复调度:先写数据的事务,先提交
无级联调度:在事务之间,读操作之前提交。
托马斯写作规则:改进型时间戳协议
用原来的时间戳排序来调度T27和T28
T27的写函数不能写入,T27回滚
解释:
改进的方向:
Thomas写规则:
区别:
托马斯写作规则的主要改革是无视过时的写作行为。
在调度4中,T27的read(Q)和T28的write(Q) 指令冲突了,这个调度不是冲突串行化的。
基于有效性检查的协议:
具体内容:
每一个事务都分成三个阶段:
重点是第二步.要进行有效性检测的需要的参数
三个阶段分别有自己的标志时间戳:
把Validation(Ti)作为事务Ti的时间戳,参加有效性检测,参与时间戳排序,看是不是可以串行化
有效性检测的具体要求:完成以下两个条件之一,就算是通过
这里的TS(Ti)是事务Ti的Validation(Ti)
要得到的结论 Tk<Ti ,事务k在事务i之前完成
1.Tk写阶段写完< Ti 读开始 -------- 事务k在事务i之前完成,串行化
Tk的写完成阶段 < Ti 的验证阶段,这个只能证明两个写阶段时间绝对不一样,Tk的写阶段,这个时间有可能Ti还在读数据啊
并且 两个事务 Tk的写 和 Ti的读 的数据项集合不相交,这表明事务的读写指令不冲突,可冲突串行化
例子:
图中的validate就是检测阶段:
可以自动预防级联回滚,(级联回滚的关键在于,如果存在依赖的情况下,依赖的一方先行提交的话,被依赖的事务如果在后续的运行中发生错误的话,被依赖的事务可以回滚,但是已经提交的事务不可以回滚,因为已经提交了,有效性检测协议的话,先是把数据都读入到自己数据副本,这个时候由于第二步的有效检测,不存在读取不到想要的数据的情况的),
多版本:
这里系统给事务一个时间戳
每一个数据项都有一组版本
一个版本有三个元素:
这篇关于数据库 06-03 时间戳,多版本MVCC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!