00:00
好,那么接下来的话呢,我们来看一看,这叫安度日志啊,在我们刚才呢,讲解的这样一个图当中啊,大家呢,实际上已经看到了这个安度日志呢,它所处的一个位置啊,和整个这个执行过程当中的一个环节,对吧?那下面呢,咱们具体来看一看这个安度日志说它是如何来保证我们这个事物的原子性的。啊,如何来保证它的原子性好,这里边提到了,我们说呢,在事物中更新数据的前置操作,其实呢,是先写入一个安lo啊,这个呢,其实就解释了咱们刚才说的这样一个问题,对吧?呃,这里边的一个关键点,第一个是更新数据啊,这个更新的话呢,不简单,不仅仅是一个叫update了,也包括呢ins和delete,说白了就是针对我们这个数据表中数据啊做了一个呃修改的操作啊,就成为呢泛泛的更新了,那这里边呢,是不包括select,也就是说呢,我们的查询操作呢,是不会写入这个安度日志的。这是一个对吧,那么再者的话呢,就是说它是在我们这个事物更新数据之前,你看我们这个三呢叫更新数据,是不是第二步呢,去把这个数据呢,写入到安度日志,也就是呢,它是把更新之前的这个数据记录到了我们的安度日志当中啊其实也很好理解,你更新之后呢,你要是记录了我们回滚呢,有什么意义呢?对吧?诶你要回滚的是回滚到你更新之前的这个情况,所以说呢,它一定记录的也是更改之的这个数据,OK,那那么这个相较于这个re度日来讲呢,这个安度日呢,整体上这个难度呢,也不是特别大,诶那我们这块呢,分成这样的几个内容呢,来来给大家呢去做一个讲解,首先的话呢,我们先说清楚啊,泛泛意义上的这个安度之日呢,它的一个基本情况,然后呢,我们再讲解一下整个这个安度之日啊,我们在使用的时候呢,呃,这呢,我起的名叫生命周期了,从一开始它的生成,然后到它呢,需要回滚的时候呢,是如何操作的,以及最后的删除啊,大家呢,主要熟悉一下这样一个过程就可以了。
01:50
好,那么说事物啊,需要保证这个原子性啊,前面我们也都讲过了,就是要么呢全部完成,要么呢什么也不做对吧?诶,那这个时候的话呢,我们需要考虑的事儿呢,就是说呃,这个在执行的过程当中呢,有可能我们这个事故呢,会出现一些意外的情况,那么这个意外情况包括什么呢?一方面呢,就是服务器本身啊,不管是我们这个麦斯库的这个数据库服务器也好,还是包括我们这个操作系统也好啊,甚至呢,包括物理层面这种断电也好啊,都有可能会出现一些意外,另外的话呢,就是我们可以主动的是使用这个roll back呢,进行数据的一个回滚操作,对吧?那么在这些情况发生的时候呢,我们就得让啊,你这一个事物当中的这个多个操作,你有可能呢,执行了一半儿,是不是就得让已经执行的这个操作呢,再回去啊。
02:34
对吧,诶造成一个假象是什么呢?就是看似这个事物呢,之前呢,做的这个事儿什么也没做,实际上呢,是因为他做了回滚了,哎,就是这个意思。好,那么这里边呢,诶,刚才我们也提到了所谓的这个更新数据啊,其实包括的就是insert delete和update啊这样的三个啊都包括,那诶咱们相当于这块呢,范范理解一下,当我们要去插入一条记录的时候啊,像表中插入一条记录的时候呢,诶这个时候呢,我们至少呢,要把这个表中啊,你插入的这条记录的这个主键值呢,要记录下来,因为你回滚的时候呢,我们是不是可以通过主键呢,把这个记录删掉是吧?那相当于呢,对于这个隐ser呢,我们相应的记录的一个delete,那按照这个主键呢进行删除,当我们要是删了一条记录的时候,注意那你删之前是需要呢,把你这条记录中的记录中的所有的内容呢,是不是都记录下来啊。
03:23
哎,都记录下来,然后当你呃要回滚的时候呢,我们就执行一个隐四的操作,哎把这个数据呢,再给你,哎回滚回来。诶是这样子的,然后呢,当我们修改了一条记录的时候,那你到底修改了一个还是几个字段,那我们就需要呢,把你修改的这个记录啊,这几个字段的就值呢给记录下来,那它呢,相较于你的这个修改啊,Update的一个操作呢,它也会记录一个相反的一个update。啊,相反的一个update,比如说你这个让工资呢涨了100块钱,相反的就是工资呢,再减去100块钱,对吧?诶就这样个情况,OK,那更新为这个就职那就可以了,好那么我们就把呢,这个记录这些回滚啊,为了回滚呢而记录的这些内容啊,那咱们就称之为呢,叫做撤销日志,或者呢,就叫做unlo啊,就是回滚日志啊就这个意思啊,这里边也强调了一下,说这个select我们是不包括的啊好,然后呢,大家再需要注意一个点,就是这个unlo呢,它本身呢,也会产生这个lo啊,因为本身这个安lo呢,它也会啊,它也要伴随着这个relo的产生,相当于也需要呢保证我们的一个持久化。
04:27
啊,这个持久性这样的一个保护啊,这个大家需要稍微注意一下。好,那么接下来的话呢,我们说一下这个安lo,它这个日志的一个作用是什么哈,诶咱们刚才提到的这些呢,其实就是提到它这个主要作用的第一个啊叫回滚数据啊,叫做回滚数据,那么回滚数据呢,这个一说就大家很清楚啊,上面也提到这个事儿了啊关键呢,我们就想给大家提一个点,就是说这个时候呢,我们对这个回滚数据啊,不要有一定的误解啊,什么叫误解呢?啊就是这个安lo呢,它对于我们这个数据呢,物理性的恢复到之前是不可能的啊什么意思呢?啊,你比如说我们这儿呢,是一个数据页了,对吧,那现在呢,我们执行的是一个插入数据的操作啊,你在这个事务当中插入两条数据,或者假设呢,你这个数据呢,在这个页呢,已经满了,你现在要插入这个数据呢,一看满了,诶我们是不是要开辟一个新的数据页,好,那我们在这个新的数据页中呢,诶你插入这条数据。
05:19
那么插入这些数据之后呢,紧跟着我在这个事务当中,我就执行了一个叫做roll back。对吧,诶我就执行这个roll back,那么问他这时候呢,就会对我们这个数据呢,相当于做个删除,那大家呢,想着说,诶是不是说让我把整个这个数据页就给干掉了呢?啊都回去了呢,诶不是的,这个注意它只是呢,相当于我们这个数据页呢,已经开辟了,那就真的就开辟了这个空间呢啊然后呢,只是呢,Back呢,相当于又做了一个delete的操作,把这一条呢添加的数据呢给删除了,而这个物理层面上呢,这个数据啊是不会出现在不会说呢,它也跟着消失的。啊,为什么这么讲呢?你想想我们这呃一个数据库当中,实际上呢,是可以同时是不是执行几百个甚至上千个并发的事物的,对吧?呃,那么我们有可能针对这个表呢,这个事物呢,添加条记录,添加了一条记录,然后另外呢,是不是还有好几条这个这个事物,好几个事物也去添加记录,那他就有可能都用的是这个新的数据页,然后呢,你要是一回国,你想把这个印呢都收回了,那这些食物咋办呢?
06:16
是吧,诶这就懵了,所以肯定是不行的啊,需要大家明确的就是我们只是从逻辑上啊,把这个数据呢恢复成原来的样子了,但是呢,你物理层面上如果已经做了一些变化,这个变化呢是帮你改不了的。啊,说的再直白一点啊,就是我们做的这个事儿呢,只能是再往前去突。啊,往前就是事儿呢,只能是一直往前做,你不能真正意义上说我们回滚了,啥意思呢?比如说这个A是吧,我我给了这个BB,咱们通过一个生活理论去说啊AA呢,给了BB的100块钱是吧,然后呢,你现在所想要做这个回滚,这个回滚呢,不是说真正意义上呢,把他这个,呃,这个事儿呢,你让他退回到之前没有发生过的状态,这不可能,只能说呢,这个BB呢,是不是又把这个钱呢,再给到A100块钱,那最后达到效果呢,就相当于是啊,没有转成啊,没有给钱,诶就这样个效果啊,实际上这个事儿的话呢,我们只能是一直往前去推着走。
07:09
你之前呢,是一个insert啊,然后我们现在呢,就做个delete,让你看到呢,是之前的这样的一个效果啊,这是逻辑上的是吧,它不是真正物理意义上的。啊,就跟说呢,两个人相处一样,这个啊,你的一些恶恶言恶语啊是吧,哎,你其实已经伤害到对方了,你后边呢,你说我再把他给哄好,哎可能是回到这个,诶之前的吵架之前的状态了,但是呢,你的这种伤害呢,有可能它就是个持续性的。啊,你只能是相当于是诶说了一些不好的话,叫负负的是吧,然后呢,又加了一些正的,哎达到个平衡,哎,当然这其实呢,是最终的效果上是一个平衡而已啊这个大家注意一下。好,那么第二个作用呢,就提到了叫MVC叫并发的啊,多多版本啊并发控制,呃,这个呢是什么意思呢?咱们主要呢,在这个MVC的时候呢,咱们再重点去讲啊,现在呢,大家先去理解一下就是。
08:00
我们这个DB这个存储引擎的这个MCC这个实现呢,是通过安度来完成的,就要多版本啊,你一听也能明白哈,并发的控制啊,当用户读取一行记录的时候。啊,若该记录呢,已经被其他的事物呢占用了,那这时候你你要读那怎么办呢?当前事物呢,可以通过呢安度啊读取之前的这个航版本的信息,诶实现这种叫非锁定的读取啊这呢就提到我们这个安度log它的第二个作用,诶当然呢,现在要泛泛的理解一下就可以了啊。好。这呢是我们对这个安度lo呢,相当于一个简单的一个理解,然后下面的话呢,我们来看一看这个安度啊,它的一个存储的结构。啊,存储的结构啊,这个大家呢也是,哎,熟悉就行啊。这个安lock呢,它是采用这个叫段的方式,哎,段的方式这个呢,我们称为叫回滚段了啊,这个back segment啊回滚段是吧,咱们前面呢讲过页讲过区,是不是讲了段,还讲了这个表空间是吧,这样几个概念啊。然后呢,这个段的话呢,嗯,说每个段里边呢,记录了1024个叫unlo segment啊注意啊,一个segment里边呢,记录了1024个叫unlo的segment。
09:11
啊,这个大家注意一下啊呃,那么在每一个unlock sment的这个段当中呢,进行安度页的一个申请,那安度页里边呢,就是你真正去写这个,诶是不是回滚的这些记录了是吧?诶就是诶就是我们刚才上面说的这些。嗯,在这是吧,哎,这些具体的回滚的记录啊。好,那么这里边这个回滚段呢,到底有多少个呢?这里边儿提到了,在in DB1.1这个版本之前,不包括1.1,我们只有一个回滚段。啊,那就意味着我们同时呢,是不是可以有1024个这个事物呢,去并发的执行每个事物呢,相当你使用一个segment对吧,这是一个,然后呢,在这个1.1这个版本之后呢,Indo DB呢,说最大的支持是128个啊,128个这个叫汇总段啊,那这时候呢,我们相当于128乘以1024,它是不是就同时支持这么多的在线并发的事物是吧?哎,这个大家去体会一下啊,OK,这个呢,是我们通过这样的一个变量呢,去做了一个查看啊OK。
10:04
嗯,这呢,就我们说这个事儿,然后说呢,虽然说这个支持128个这个回滚段,但是这些回滚段的数据呢,诶都存储在叫I中,这个I呢,咱们在讲这个结架构的时候啊,在讲这个这啊这个目录结构的时候呢,我们提到过它是一个共享的这个表空间,对吧?啊以前的话呢,我们说这表数据呢,都可以设置在,呃,存储在这个里边的啊。好,那么这里边呢,涉及到涉及到这个几个参数啊,这个大家了解一下,这个inno DB啊,这个安度的directory啊,这个呢,就是我们整个这个呃安log它的一个存储位置啊,如果我们去查看的话,这个默认值是一个点啊,其实也是一个点斜杠的啊,这样个情况啊,放到这啊。也是一个点斜杠这样一个情况,来我们这呢,也可以去查看一下啊,CTRLC一下啊回过来,那我们在这个位置呢,就可以去输入一下啊收。Variables like是吧,我们把这个呢粘一下。哎,这么着是吧,诶点斜杠的一个情况啊,实际上呢,也就是存在咱们当前的一个数据目录下啊,就是挖点le.mysq啊这样一个目录下,那目录下呢,不是有这样一个共享表空间对吧?OK,然后下面呢叫in DB log啊这个呢,就设置我们说默认的这个叫什么我们这个呃,回滚段的这样一个个数的啊滚段的个数,然后下面呢,提到叫in DB的table space啊它呢构成我们啊回滚的文件的数量。
11:28
啊,文件的数量啊,这个呢,我们可以呢去设置多个啊,但这里边儿呢,就提到了这个至少呢,你得有两个这样的这个呃表空间啊,相当于呢,比如我们这一个文件,这个文件,这个文件呢,现在比如说在使用这个文件呢,相当于它比如在一些做一些清理操作啊,至少我们都有俩啊下边会提到这种重用的这样个事儿啊。默认情况下呢,我们如果查看这个参数的值呢,它的值呢,其实就是二。啊,也可以回过来,我们去做一个查看啊收。Variable and like,然后我们把它粘过来。
12:00
诶,默认这个只能看就是二是吧,那也没问题啊好,那么上面这个参数的话呢,提到了说一般呢,我们也很少呢去做这个改动啊,这个大家呢,了解一下就可以了,然后接下来的话呢,我们提一下这个安度页的一个重用啊,就是这个页的话呢,我们也是考虑会重用的啊呃,这呢就提到个什么问题呢,说如果我们每开启一个事物的话呢,咱们就去呃。这个这个相当于把这个数数据呢是呃,你这个执行这个增删改之前呢,这个原始的数据是不是都需要记录到我们这个安度log当中,对吧?呃,当然这时候呢,如果我们每一个事物的话呢,嗯,都需要呢去申请这个页。啊,每个事物呢,都去申请一个独立的页的话呢,那这时候呢,我们说一个页大奖呢是16KB啊,如果呢,都这样的方式去分配呢,其实是非常浪费的啊,你比如说呢,我们这个TPS就是每秒钟我们处理这个事物的数量啊,如果呢TPS呢是1000。那就意味着我们一秒钟呢,其实你一个事物呢,就对应了一个页,相当于是就需要操作1000个页,那这个大概呢,就是16兆的一个大小,那么一分钟的话呢,就相当于是1GB了啊,那这样下去的话呢,如果说清理的不不及时的话呢,那整个我们这个空间占用情况呢,是非踌快的啊,是没有必要的是吧,就是空间占用快的话呢,如果说你这个空间都占用了啊,都使用上了,那也还好,但关键的就是我们一个事物对应一个页的话呢,其实还是很浪费这个页的空间的。
13:17
啊,因为这个页里边呢,大部分都是空的是吧,那怎么办呢,我们就可以考虑这个安度液呢,它可以被重用啊,可以被重用啊嗯,这里边呢,就提到了,说这个安度页呢,可能混就是我们在一个页当中啊,它有可能混杂着好多个事物,对吧?那么在我们这个安度log呢,在提交以后,哎,它会被放到一个列表当中。哎,放到这个列表当中,然后呢,如果我们这个安度液的这个使用空间呢,小于3/4了啊,那这时候我们这个安度液呢,它就可以被重用啊,相当于呢,你使用的小于2/4,相当于你用的还算是比较有限的,那我们就可以考虑呢,去做一个重用。啊,就这样一个场景,好,那由于呢,我们说这个安lock呢,它是一个离散的啊,因为我们在一个页当中呢,你可以有不同的这个事物呢参与,所以我们清理工作呢,其实效率不是特别高。
14:05
啊OK啊,这个呢,先有一个了解啊。然后下边呢,提到说我们这个回滚段呢,与这个具体的事物啊,具体的事物啊,这呢有几个点,咱们就直接说一下就行啊,一看大家都能明白,说每一个事物呢,都会使用一个回滚段啊,一个回滚段呢,在同一个时刻呢,可能会服务于多个事物啊,这个没问题,对吧?好,当一个事物开始的时候呢,会制定一个回滚段。啊,在事物进行的过程当中啊,当数据被修改的时候呢,原始的数据会被复制到这回应段里边,这都没问题啊,在回应段中,事物呢会不断的填充我们这个盘区啊,直到这个事物结束,或者所有的空间呢被用完了,当当前的盘区不够用的时候啊,事物呢,会在这个段当中呢,请求下一个盘区啊,段里边呢,不是放的是区嘛,对吧?如果所有的这个盘区呢都用完了,事物呢会覆盖最初的盘区,或者在红木段中呢,允许的情况下呢,去扩展新的这个盘区。哎,这样个情况。
15:01
哎,回滚带呢,存储于安度表的这个表空间当中,在数据库当中可以存在着多个安度表的表空间啊,这个我们不是刚才也查看这样个参数了是吧,至少这个值呢得是二。好,然后下面呢,提到这个事儿啊,当我们这个事物在提交的时候呢,印度DB的存储引擎会判断两个事儿,第一个啊,你是不是要提交了,因为呢,一旦提交以后呢,我们就不会去回滚数据了,那这是我们就可以考虑呢,把这个安lo呢放到这个列表当中,一共之后呢,我们去有这个清除的线程呢,去做这个清除的操作,对吧?其次的话呢,我们需要判断一下这个underlo呢,它所在这个页呢,是不是可以去重用。啊,我们刚才也说到这个比例低于3/4的话呢,使用率啊,低于3/4的话呢,是可以考虑重用的啊就这样个场景。好诶,下边呢,我们再给大家去讲一下叫回滚段中的这个数据的一个分类啊,诶我们这个数据还有分类之说吗?啊有啊,就是回滚段中我们记录的都是叫安lo了是吧?那这些数据的话呢,我们分成了三种情况,第一种呢,就是未提交的这个回滚数据啊,这个随着我们这块呢,呃,你比如说我们一个具体的啊好几个吧,增然改操作是吧,每做这个操作之前,我们需要呢,把这个原始的这个数据呢,是记录到我们这个呃安log啊,相应的这个回控调当中是吧?诶每一个执行之前呢,都需要在这里边去做个记录啊,都如此。
16:16
好,那么当我们这个事物还没有提交的时候呢,那随时呢有可能回滚是吧,那这时候呢,呃,我们把这个里边的这个数据呢,称为是第一种状态啊,称为是第一种状态,好第二种的说呢,叫已经提交但未过期的回滚数据啊,相当于我们这时候呢,到最后呢,已经是做了这个commit的操作了。啊,当然可没操作完之后呢,我们说这个数据呢,还没有过期啊,有同学可能会想说,诶我们这个11提交了,他不就不能回滚了吗?既然不能回滚了,那这时候呢,我们这个数据呢,不就完全失效了吗?啊,其实还不然是吧,那我们这个提交之后呢,分成两种情况,第一种呢,就是未过期的,第二种的话呢,就是过期的。诶这样两个情况,诶这里边提到说事物提交之后呢,不能马上去删除安杜lo和安lo所在的页啊,这是因为呢,可能还有其他的事物呢,通过安lo呢,来取得这个航记录之前的这个版本啊,这个呢是有可能的,所以呢,我们这边呢,把它先放在这个链当中,然后呢,呃,由我们这个相当于这个per这个线程啊,它来最终去判断我们这个log和所在页呢,诶是不是要删掉。
17:18
啊,包括呢,是不是还提到一个叫重用的一个情况是吧,好这呢,就是先对于我们整个这个安lo呢,大家先有一个直观的一个理解。好,那么刚才呢,咱们提到了这个回滚当中这个数据的一个分类啊,关于第二个和第三个呢,其实大家呢,在这个2.4的关于安度的一个类型上呢,也能够体会到啊,关于这个安度呢,我们类型呢分成两种,第一种呢叫做inser类型的,第二种呢叫做update类型,哎同学说诶怎么没有delete类型啊,Delete跟我们的update呢,相当于是诶合在一起了。那从这个角度上来讲呢,我们把这个安度呢,这个log是吧,分成了两种类型,呃,针对于这个隐色的这种类型的操作啊,它产生的这个log呢,我们就称为呢是第一种,因为呢,这个隐色操作这个记录,它只对咱们事物本身呢是可见的,其他的事物呢是看不到的。
18:04
啊,这个呢,就是我们这个隔离性的一个要求啊,对于其他事物呢,看不到,那这个呢就决定了,如果我们这个事物提交以后啊,因为别人别的事物呢,也不会用到它,所以呢,我们这个安度log呢,就可以直接呢去进行删除操作了。对吧,诶它就可以直接删除了,就是我们可能直接理直观上理解的就是我提交了以后呢,我这个lo就应该可以清除是吧?诶指的这个意思啊,但是呢,有一些场景啊,你比如说我们这个安这个update,这个安lo,它呢是对于这个delete和update啊产生的这个安lo,那这个安lo呢,它需要提供了叫多版本并发的这样一个机制,因此的话呢,我们当前这个事物,你提交完以后的话呢,是不是还有可能其他的事误呢,要查看啊,你当前这个操作之前的这个数据,所以呢,我们不能急着呢对它进行删除啊,把它们要放到这个安lo这个量表当中,那由我们这个清除的线程来决定,最后呢清除的这样一个行为。啊,这个大家呢,去注意一下啊。好,那么下面的话呢,咱们就来给大家去说一下这个安log呢,它一个整体的生成的过程啊,包括后边我们使用的一个过程啊,现在这个概述上,大家对整个安度lo呢,有一个简要的一个理解啊,你比如说我们现在呢,有两个数值分别呢,是A是一,B是二,然后呢,把A呢修改成三,把B呢修改成四啊那么在这个过程当中,我们的安度和锐度呢,它的一个执行情况。
19:20
首先呢,我们开启这个事物,那因为呢,你是要把A呢改成三是吧?呃,那我们就需要呢,记录A等于一,它的这个值呢,先到这个安度lo当中,然后呢,你改成三了,那这时候我们需要呢,把你更新以后的数据呢,是不是记录到我们的read log当中,对吧?然后呢,记录一下这B等于二,嗯,把它呢,因为你要改成四,所以把它原始的值呢放到安log中。然后呢,更新为四之后呢,把这个值呢,记录到我们的relo当中。诶注意这个呢,Readlo呢,咱们记录的是,呃,咱们说的是物理上的一个记录是吧?啊比如说你在哪个页磁盘中的哪个页上,然后呢,哪一个偏移量上,我们要改成个什么样的数据啊,而我们这个安lo呢,它是逻辑上的一个啊记住啊,这个大家注意好,那么在这个整个之后呢,我们需要呢,诶把这个readlo呢,相当于刷盘到我们这个磁盘上啊具体这个刷盘策略呢,咱们前面也都讲过了啊,有具体的一个参数呢,进行控制的对吧?好,那这呢有一个这个commit。
20:11
啊诶同诶怎么commit之后,呃,Commit之前我们就刷盘了呢,这个呢,我们说还是有那个参数控制啊,诶我们呢,有的时候呢,是这个commit的时候呢,再去刷盘,然后呢,还有一种的策略呢,是每隔一秒钟啊,是不是就有一个刷盘的一个策略了,是吧?诶这样去理解一下,好,那么在整个这个过程当中,大家会看到这个安dolo和这个redolo的一个使用情况。好,那这里边儿呢,你看具体剖析的时候呢,我们说如果呢,在第一步到第八步。这个过程当中,我们如果发现这个系统呢,出现这种宕机了,由于呢,我们也没有执行这个commit,诶你的这些修改操作呢,是不是只是在内存层面去执行的,那如果宕机了以后呢,诶这个又重启了,其实呢,不对我们磁盘中的数据产生影响,现在这时候呢,是不是本身呃磁盘中的数据就是啊,或者说你再查看一下这个数据是什么数据啊,其实就是我们之前那个数据,因为呢,你内存中去查看的时候呢,就得是从磁盘又重新加载到内存中的,对吧?这个磁盘中的数据呢,由于你没有commit过。
21:06
或者我们先说这儿吧,在这个过程当中的,对吧,还没有到这个八这一步刷新到磁盘的啊,所以这是我们磁盘中的数据呢,都是这个旧的数据啊,就不涉及到我们再去呃显示的做这个回滚啊,这个这样的一些行为了啊这个呢是不受影响的,那如果呢,我们是在这个第八步和第九步之间呢执行的啊,你就比如说呢,我们这个呃,默认的情况下呢,它有一秒的一次这个刷盘的这样一个行为,那恰好呢,在你没有commit之前呢,他刷新过这个磁盘的操作了。那这时候呢,是不是就意味着我们这个数据呢,就已经给持久化了,对吧,那数据已经持久化了,但是你这时候呢,还没有执行commit啊,那就是从这个逻辑上来讲的话呢,呃,你是可以考虑呢,执行commit和是不是back呀。诶roll,诶back,哎,那也就意味着如果你要是执行commit的话呢,哎,我们这个数据呢,本身也已经持续化到磁盘上了,哎,那就OK的啊就结束这个事物就完事了,那如果说呢,你要执行的是这个roll back的话呢,那我们就需要呢,是不是把你已经刷新到磁盘中的这个数据呢,在使用我们上面这样的一个记录情况啊,使用这个安lo呢,是不是再给他恢复一下,就相当于你把这个磁盘中这个数据呢,再改回我们原始的这个数据。
22:12
啊,这呢,我们就有一个支撑,就是因为呢,你都记录了这个安lo了。没有问题是吧,啊是这个啊,然后呢,你要是在这个九之后啊,出现了这个宕机了啊,那这时候呢,其实也没什么影响啊,因为这时候的话呢,你都已经提交了,然后也刷新到磁盘了,这个数据呢,其实就已经是给固定下来了。啊,对吧,哎,就是这样的情况啊。好,那么接下来的话呢,我们就说一下,在只有这个B铺的这个流程当中啊,也就是没有我们这个锐度和安度的这个情况下呢,诶,我们针对于查询操作啊,针对这个增删改操作啊这块呢,就是诶我们画的一个简图,呃,如果呢,我们内存的这个八分铺当中没有你想要查询的数据或者更新的数据呢,那你就从这个磁盘中去加载就可以了。对吧?诶这个更新完数据之后呢,定期呢,是不是有个刷盘的一个策略啊,就这样子的,那么在有了我们这个redolo和安dolo之后啊,这个之后,那我们看一看,呃,我们这块呢,以更新数据为例啊,这时候呢,我们要更新个数据了啊,这时候我们去这个八分铺中呢去找,那如果呢,要数据不存在呢,我们就要从磁盘中呢去进行一个加载,这都没问题,对吧?那么我们要更新的话呢,是不是更新之前先要把这个记录呢?是不是记录到我们这个安lock当中啊,放到我们相应的这个回滚段这个文件里边。
23:20
然后呢,你去做这个更新的操作。在执行器呢,帮我们做这个更新的操作,那么更新完以后的话呢,我们需要呢,把这个更新以后的这个数据,相当于是不是记录到我们先是内存层面的叫redolo buffer里边,对吧?然后呢,Redo log buffer呢?呃,我们相应的是不是有对应的这个,呃,参数控制的那个策略,它需要呢,把这个内存中的这个数据呢,是不是在更新到它这个redo log当中。对吧?Lo,这个file当中啊,这个呢,就是磁盘当中的这个文件里边,然后呢,咱们不是说的叫啊write ahead啊logging是吧,就是呃,日志文件优先的原则,就是因为先要写它,然后的话呢,我们再去呢,把你内存中这个数据呢,呃,再刷盘到你真正磁盘中的那个数据链当中啊,这个注意一下,然后在这个过程当中啊,大家你会看到我们还要去处理一个文件,这个呢叫blog的诶日志文件。
24:08
啊,这个呢叫二进制文件,这个文件的话呢,是对于我们后边讲主从复制的时候啊,主机呢,把这个数据呢,相当于记录到这儿以后呢,从机呢,拿着这个文件以后呢,它就能够知道你主机到底都做了什么样操作了,实现一个主从数据的一个同步,啊这个能把这个blog呢也提供到这儿了。好,大家了解一下啊,这呢是我们说整体上的一个简图哈,然后的话呢,我们再看一下,这个叫详细的一个过程啊,详细的一个过程呢,我们就以具体的例子来说了啊这里边儿呢,我们就需要呢,提到了咱们前面讲的这个数据页当中一个结构啊,提到这个行格式,行格式里边呢,我们有三个隐藏的列。啊,大家呢,不知道还有没有印象啊,你看回到我们当初讲的这个课件。咱们在提到这个印洲DB数据存储结构的时候啊,打开一下我们这个课件啊。嗯,这样。好,那么我这块呢,呃,这个搜索一下啊,隐藏列是吧,好大家看咱们在当时讲这个呃行格式的时候呢,呃提到过说我们真实的这个一条记录,它其实呢,还会有三个隐藏的列啊,分别对应的叫ID transaction ID,这个啊就是我们叫回滚指针啊,所以呢,这三个字段真正的名称呢是它,然后呢,这三个字段呢,咱们当时说呢,说的放到后边我们再讲,哎叫十物之志,那其实呢,不就是咱们现在要给大家讲的这个。
25:24
哎,这个15日日嘛,哎,这个前后呢,我们就搭到一起了啊好,那么这个关于叫UID呢,这个就不用多说了,咱们前面提到过,如果呢,这个表我们没有显示的去定义主键。啊,你没有一个键哎,没有一个字段指成primary key,那这时候呢,这个系统呢,会自动给我们选择一个非空的一个唯一的索引,如果这个也没有,那T呢,会自动的给我们添加一个叫ID的隐藏列来作为我们的主啊,因为你整个这个数据的话呢,需要我们说呃,索引及数据嘛,是吧,你底层要存储数据呢,一定要有这样一个主的一个角色啊。然后呢,再者的两个呢,就提到了一个呢,叫做室外地。哎,就是我们对应的这个是不是叫事物ID,那就相当于我们这条记录呢,呃,目前呢,是哪一个事物呢,正在操作它这个我们就记录了这个叫事物的ID。
26:08
啊,你想只要我们这个事故呢,你要提交了,那相当于这个时候数据呢,就更新完成了,你要是没有提交这个事故呢,发生一些回滚操作,是不是针对我们这条数据,针对这个事物的ID,我们就要给它进行修改了,是吧,就是这个,然后另外一个呢,叫回滚指针,这个回滚指针呢,就是诶我们说呢,这个行记录呢,记录的是你当前这个内存当中啊,你当前的比如修改以后的数据,那这是真实的,那你要是去回滚的话呢,你是不是得拿着这条数据呢,跟之前那个。Update之前的那个行为呢,你看那个记录旧的是多少,那这时候呢,是不是就要关联一下那个安lo呀,对吧?诶那么这个时候的话呢,我们通过这样的一个变量啊,叫回滚指针呢,它来记录一下啊,或者叫关联上啊,我们那个安度log它的一个位置。好,举个例子啊,你比如说我们在这个begin当中启动一个事物了,添加了一条记录,对吧,来添条记录,那我们这个记录的当中啊,呃,这个delete mark啊,这个咱们前面也说过啊,就是删除的这个标记呢,就是零啊,当年没有删除嘛,啊当年是YD,好这个回滚值呢,就记录一下你这条记录在添加之前的这样的一个行为。
27:12
啊,添加之前这样个行为啊,现在的话我们插入了一个叫Tom啊,然后呢,当我们在线的这个基础上呢,再去执行一个update的操作时候,比如说我们把ID等于一的这样一条记录呢,改成了Tom的名字呢,改成了叫萨。啊,那么这时候的话呢,注意看我们此时啊,刚才呢,生成的这个安lo呢,Number是零,然后在它的,诶最近的这样的一条安lo呢,诶被我们这条记录的回滚指针所指向,而这个啊,新生成的这个安lo呢,去指向你旧的这个安lo。啊,这呢,我们改成是算了,在这个行记录里边呢,记录的永远是我们说最新的这个数据啊,这是没问题的,好,那么关于我们这个unlo呢,这个结构里的详细的数据是怎么记录的,咱们就没有必要去熟悉了啊,大家如果有兴趣的话呢,可以回头呢,呃,咱们2022年的这个麦斯高级的这个教材呢,也会出版啊,出版的时候呢,大家到时候你可以去关注一下这些细节。
28:05
啊,咱们在这个视频当中啊,就不过多的去牵牵扯这个内容了啊,从这个实际大概开发的角度来讲,你也没有必要呢,再去使用到这个级别啊OK,好,那么这是我们记住这个情况,然后在这个场景下呢,我们呃再做一个update一个操作。哎,我再做一个update操作,我呢把这个ID等于一的这条数据呢,改成ID等于二了。那么这个在底层的操作呢,是什么样子呢?这个大家注意,我们并不是简单的把这个数据的一改成二了,而是呢,把这条记录呢,标记为是一个已删除的状态。对吧,然后呢,我们再重新的啊,生成了一条记录ID呢,是二啊,是叫萨,诶这个大家注意一下,那么我们这时候呢,也会在原有的这个记录上呢,会有一个安度的一个log啊,这个呢,就是二了是吧,它是最新的啊,所以是这样一个指向,那么这个呃,它里边的记录什么呢?其实就相当于是我们的delete mark呢,就从零到一了啊这个过程,然后这里边呢,又记录一个新的,就是这个呢,其实相当于是记录了,就是你之前的ID是一是吧,现在改成12了。
29:02
啊,那这呢,就是整个呢,我们进行这样的几个操作啊,这样几个操作的过程当中,我们生成的这个安lo这样的一个情况。啊意思呢,是向前推的这样一个状态,对吧?那么接下来的话呢,我们看一下这个安lock呢,是如何回滚的啊,你比如说呢,我们就执行了是不是一条两条三条,呃这样的三条呢,D的一个操作,然后接下来的话呢,我们做了一个,那就意味着我们首先呢,诶是不是需要有这样一条记录啊通过呢,这个number是三的,这个unlo呢,你把ID等于二的这条数据呢,给它删掉。啊,这条数据呢,相当于给删掉了,删掉以后呢,是不是就回归到回到这个场景了,在这个场景当中呢,我们执行这个underlo呢,NUMBER2的这条记录,你把这个呢delete mark呢从一呢改成零啊相当于这时候呢,他不是又回来了吗。是吧,哎,这时候相当于是我们把最近的这个啊,这个update的这个语句呢,相当于给回滚回去了,是吧,然后再接下来的话呢,执行的就是这个了啊这个当中呢,其实把这个三呢,是不是就改成这个PM了,然后再往前的话呢,相当于是你的隐色这样个行为呢,也没有了。
30:03
哎,就是这样的一个过程啊,这呢就是我们执行的这样一个整体的流程啊,大家熟悉一下。那么下面的话呢,就是针对我们生成这个安lo呢,它的一个删除行为,所以咱们在上边呢,已经讲过了啊,针对这个隐私的行为呢,因为对其他事物呢不可见,所以呢,诶只要我们这个数据呢,你回滚了或者叫提交了,诶相当于我们这个事物本身呢,是不是就已经结束了呀。哎,咱们前面说过呢,这个事物呢,要么是一个已提交的状态,就是commit了,要么就个终止的状态,相当于roll back了啊,总之呢,只要你这个事物结束了,那我们记录的隐私的这些,呃安lo呢,它就没有用了啊,可以直接删除,而对于update呢,提到了这个多版本并发的这样一个访问了,所以我们还需要呢,留一下啊,你先放到这个,呃安lo这个链表当中啊,等之后呢,这个。清除的线程来决定要不要删,OK。好,这呢,就我们说的这样个事儿啊,这个我们破纸这个线程啊,它的作用呢,有两个啊,这个咱们相当于是一个补充了啊,大家了解一下就行,就是第一个呢,它是负责清理我们的安度页啊,刚才提到了是吧?诶另外一个呢,就是清除我们这个诶配置就是数据页里边呢,带有我们这个delete bit这个标识的这个数据,行诶这什么意思啊,就是咱们前面说到过,就是咱们真正要删除一条数据的话呢,其实只是把这个零呢,是不是标记成一,没有真正的去删除,对吧?诶如果真正的你要是想我们把这个空间腾出来的话呢,需要用到的就我们这叫破这个线程啊,这个大家注意一下就行。
31:24
好,那么最后呢,这有一个小节还是呢,咱们呃讲这个瑞度log时候呢,用的这样的一个图,哎,通过这个图呢,大家整体上对于我们瑞度和安度他的这个角色呢,呃,有一个清晰的认识就可以了,需要明确的一个点,前面也提到过了,安度和我们这个瑞度啊,他俩可不只是一个逆过程啊,咱们一开始的呢,也表达过他们二者的一个联系啊,区别啊,是不是我们在一开始的时候呢,这块呢,也强调过了啊,这个大家呢,再去熟悉一下好,那么这一章呢,就是我们提到了叫呃事务日志啊,安度日志,锐度日志,诶整体上大家知道呢,这两种日志呢,是做什么用的啊,具体的一些细节呢,这块呢再关注关注就可以了,整体上来讲呢,难度不大啊。
我来说两句