00:00
好,那咱们接着来讲啊,这个麦高级呢,咱们这块呢,一共是分成了四个小的篇章,对吧?那么其中第二个小的篇章呢,我们提到是关于索引和数据库调优的这个内容,对应呢,就我们从这个第六章一直到这个第12章啊这这一部分呢,我们就讲完了,那么接下来的话呢,我们要讲的就是从这个第13章一直到这个第16章,这四个章节呢,咱们涉及到呢内容呢,叫做数据库事务啊数据库事务,那首先的话呢,我们来看一下这个第13章叫事物的基础知识。嗯,咱们在讲到这个上篇的时候呢,提到过,呃,这个table啊,Delete from啊,当然呢,我们还讲到了这个commit和对吧,当时的话呢,我们就提到了这个事物这个概念啊,但是呢,没有详细的去多讲啊,那如果说呢,大家呢,关于事物这块内容也只停留在我们上篇呢讲的这点内容来讲,那么这一章的话呢,应该说呢,有一些概念性的东西呢,还是需要大家去理解理解的。啊,那如果说呢,大家之前呢,呃,自己自学过啊,或者也接触过这个事物的内容的话呢,那么这一章的话呢,应该算是比较基本的这个内容。
01:00
OK,那么这一章呢,咱们主要呢,讲这么几个事儿啊,首先的话呢,你得清楚是什么叫数据库事物,对吧,什么叫数据事物啊,一般呢,一提到事物的话呢,我们都会提到事物的四大特性。啊,或者叫四大,呃属性啊也行,叫a cid是吧?A cid的话呢,实际上对应的是四个单词,那就是四个特性啊四个特性那首先呢,你得清楚这四个特性呢,分别是哪几个特性。啊,这个面试的时候呢,有可能会问到你这四个特性,那如果说呢,你这四个特性呢,都说不出来,那估计呢,他也不会再问你关于事物更深入的内容啊,那说明最基本的点了都不清楚的是吧?哎,这是我们说的这个四个特性,然后这四个特性里边这个I呢,叫做isolation啊,我们称为它叫隔离性。啊叫隔离性啊,那我们这里边儿呢,就提到了事物的话呢,我们需要呢,诶来保证这个事物的一个,呃,我们叫一致性啊安全性啊是吧?诶那同时的话呢,我们还要呢,尽可能的达到这种高并发的这种场景,那怎么办呢?诶这是我们就涉及到这隔离的这种不同的级别了。那么提到这个隔离机位的话呢,我们首先呢,要提到一个关于数据并发的问题,对吧?这里边儿呢,就涉及到了有这个脏鞋脏读不可重复读换读诶这样的问题啊,那我们这一章呢,也要讲清楚这诶四类呢,这个问题呢,分别是什么意思对吧?那以及的话呢,针对我们解决这些问题啊,咱们就提到了叫四种隔离级别。
02:21
啊,分别呢,对应的就是1234诶这四种隔离级别,那我们这时候呢,还要去讲一下这个MYSQL呢,是如何支持这四种隔离级别的,包括呢,我们代码层面呢,该如何呢去设置这种不同的隔离级别,对吧?诶这呢就构成了我们这一章的这个重点内容,包括呢,我们还会去提一下呢,如何在代码层面呢,去体现咱们开启十物这样的一个操作,OK啊这呢就我们这章的整体内容,那么首先的话呢,我们来看一下这个第一个点啊,叫数据库事务的一个概述。啊,概述嘛是吧,就是整体上来介绍一下啊行,首先的话呢,这里边儿提到说事物啊,是这个数据库区别于文件系统的重要特征之一。诶,这里边提到叫文件系统啊,其实就咱们平时强调的,呃,咱们存储的那些文件对吧?诶跟我们这个数据库的话呢,其实都是一种持久化的媒介,那数据库为什么跟他们会有呃显著的区别呢?这里边儿呢,就提到了一个事物啊,在这里边呢,起到一个非常重要的作用啊,那事物怎么去区分他们呢?其实就提到了我们事物的这ACID4个特性了。
03:20
啊,等我们讲完的时候呢,大家其实呢,就会有感觉啊,就有感觉行,那我们下边呢,就具体来看一下,首先的话呢,我们提到了这个MYSQL啊,它的这个存储引擎,咱们在讲到这个存储引擎这一章的时候呢,其实讲到过啊,不同的这个存引擎它的特点是什么啊,其中有一点的话呢,就是关于有的存储引擎呢,是支持这个事物的,有的是不支持的,对吧,那首先呢,我们做一个查看啊,咱们回到这块呢。来回到这边吧,咱们首先呢,去登录一下是吧,哎,这个MYSQL-U啊root用户啊杠P啊KC123啊登录成功了,然后呢,我们使用呢,叫做show啊engines。对吧,诶这样一个命令的话呢,我们就能查看一下这个功呢,它支持的这个,呃,存储引擎都有哪些,那么我们看这块呢,叫transactions啊,这个就是关于事物这个意思,那其中标识yes的就只有一个啊,那就是我们的in DB啊,它是支持事物的。
04:11
啊,明确的我们要指明呢,In DB是支持的,MY是不支持的,OK,所以说呢,我们5.5以后的话呢,相当于使用的DB呢,就是认支持这样一个概念啊,那这里边呢,我们重点呢,其实讲的这个事物这个章节呢,其实就是在DB下呢,我们来讲解的。OK,这个就清楚了,然后下边呢,我们来看这个具体的内容啊,首先的话呢,就提到说,诶什么是事物呢?呃,如果说要用最简单的一句话来刻画的话呢,应该就是这句话。说呢,它是一组逻辑操作单元啊,一组逻辑操作单元使数据啊从一种状态变换到另一种状态啊,这个呢,就是成为呢叫一个事物,这里边这个关键词呢,叫做一组啊操作单元,这个操作单元的话呢,大家就可以理解成是我们写那个DMMR的那个操作是吧,增删改这样的一些操作啊吧,哎,那么有一组增删改的操作呢,在一起,那么它针对我们这个表中的数据啊来进行一些操作啊修改对吧?哎,是一种状态变化成另一种状态,范范这样讲啊,那么大家呢,肯定光看这句话呢,你是理解不了这个事物的啊,然后接下来的话呢,我们看一看这个叫事物的这个处理的原则。
05:16
诶把这个呢,我们说完之后呢,结合着一个例子呢,哎,大家对这个事物的理解呢,应该是就比较清晰了啊呃,那这里边呢,提到说事物啊,它都必须要作为一个工作单元呢来执行啊,说即使出现了故障呢,都不能改变这种执行方式啊,作为一个整个单元来进行处理的。啊,那么一个事物当中呢,它往往会包含着多个啊DL的一个操作啊,那要么呢,所有的这个事物中的这个操作呢,都被提交了啊commit了,那这时候呢,我们就意味着这些操作呢,就被永久的保存下来了,那要么的话呢,就是我们数据库管理系统呢,将放弃所做的所有修改。比如呢,我们这里边有五个啊这个颠码操作,那其中你做了仨,那俩没做,那不行,那你把已经做的这三个的话呢,现在也得回滚回去啊,使得呢,我们回到一个最初的状态。
06:03
啊,就是这样的一个大体的一个概念啊,那这里边儿呢,我们拿一个真实的例子呢,给大家去讲一下啊就清楚了。好,比如我们这个案例的话呢,就是AA给这个,呃,用户AA呢,给这个用户BB呢,去转账100块钱啊,当然前提呢,是他们这账户里边这个钱肯定是够的,对吧?诶转账100块钱,那么这个操作话呢,实际上是不是对应着两个电的一个操作啊,准确来讲呢,是两个update这个操作,对吧?那我们就可以这样写说update account,这是我们这个表明说set money呢,等于money减去100 where name等于A相当于A,这个用户呢,是不是减了100块钱。啊,那么同时的话呢,我们这个BB这个用户的话呢,是不是应该加上100块钱。啊,那么大家看我说呀,这里边儿的这两个操作啊,整体啊,就构成了我们一个事物。啊就构成这个事物,为什么这么讲呢?因为我们说呢,他们必须得做一个整体出线,也就是说呢,呃,要么呢,这个A减去了100,那么同时呢,这个BB呢也加上了100,那这时候呢,我们相当于是呢,这两个操作就执行完了,就意味着我们这个事呢就执行完了,那此时的话呢,我们就可以呢去提交这个数据,然后呢,把这个数据呢永久的保存下来,相当于呢转账成功。
07:10
对吧,诶那要么呢,诶要么呢,就比如说刚才我这里边呢,写了一个叫服务器宕机了啊,那如果说呢,我们第一个AA这块呢,减100块钱减了,但是呢,BB还没有加着100块钱啊,比如说中间出来出现了一个服务器宕机啊这样的一些行为,或者是这个停电了,对吧?导致的话呢,我们BB呢,这100块钱呢,没有增加上。啊,那么你想那A呢,减去了100块钱,BB呢,这个钱还没增加上,那你想是不是要把A这100块钱给人家退回来呀?啊,那这呢,就是我们所谓的你要回滚到我们最初的啊A呢,就是有着100块钱的这样的一种状态上。那么整体来看的话呢,就是这两条语句呢,我们说要么呢是不是就都执行,要么呢是不是就都不执行啊,诶作为一个整体出现啊,那我们说呢,这两个就构成了一个事物。啊就构成15,好,那我再举个例子,咱们比如说这个说我们说这叫AA呢,是不是给这个B呢?诶转这个100块钱是吧,那如果同时的话呢,我们这个CC的话呢,诶还得给这个DD呢,转账100块钱啊这个ABCCDD其实都不认识啊,那么问说我们这四个操作的话呢,诶会构成一个失误吗?
08:15
准确来讲,其实就不是一个失误了,其实是不是两个失误啊,因为呢,你这块呢,是一组要求啊,要么都执行完,要么呢就都回归到最初状态,相当于要么转账成功,要么呢转账失败,对吧,那CD跟DD的话呢,这是你俩的事儿,这两个之间是不是没有说呢,要求他们必须呢,一定都做,或者一定都不做。啊,他就没有这种所谓的这个一个工作单元这样的一个概念是吧,所以我们中间就把它分开,说你这儿呢是一个事物,你这儿呢,它是一个事物。哎,就是我们说的这样一个情况啊。好,那这呢,咱们就把这个事物呢,就说清楚了,那么在整个这个事物,包括事物的处理原则当中,其实就蕴含了事物的这样的几个特性。哎,什么特性来,我们叫ACD这样的特性啊,这里边我们讲解的话呢,就按照这个顺序来说啊,A叫原子性,C叫一致性,I啊叫隔离性,这个D我们称为呢叫持久性。
09:07
按按照这个按照这个顺序来说好,首先的话呢,我们来看一下,这个叫原子性,说这原子性啊,是指这个事物啊,它是一个不可分割的工作单位是吧,要么呢全部提交,要么呢就全部失败呢,回滚了。啊,就像我们这个说的,要么转账成功啊,要么呢,就转账失败,没有中间状态。对吧,没有中间状态啊,成王败寇,成了那就是王,败了那就寇,没有中间状态,你说我们这个停战一会儿吧,组成一个联合政府吧,没有这一说。啊,没有这一说啊,这个没有中间状态啊,这一定要注意。啊,应该呢,很好理解,就是一个整体嘛,咱们所谓的原子性呢,就是借助了说物理世界当中,咱们认为最小的单位就是个原子,你不能再分了,是吧,所以呢,他们就一定是作为一个整体的,所以他想表达的是整体性的这样一个概念。好,那接着我们来看这个下边这叫一致性啊。这个一致性呢,这个如果大家呢,你是个面试官的话呢,我建议呢,你可以呃问事物这个面试题的时候呢,重点的去问这个一致性和这个隔离性啊,因为这两个的话呢,是最不好拿的啊,这个隔离性的话呢,其实就涉及到我们下边这个隔离级别了,而这个一致性呢,往往呢,它理解呢是有问题的。
10:15
啊,这里边我也写了,说国内很多网站啊,或者一些帖子啊等等啊,对这个一致性的阐述呢,是有问题的,或者说呢,是不全面的啊咱们这块呢,对这个一致性呢,诶这个真实的一致性呢,做个说明,这个一致性啊,它是指咱们这个事物啊,在执行前后数据呢,从一个合法性的状态变换到另外一个合法性的状态。哎,这里边你看提到一个词是不是叫合法呀。啊,咱们经常呢,在这个写代码的时候呢,说呃符合规定啊叫合法的,不符合规定呢叫不合法,那个合法呢指的是语法上的啊注意是语法上的,比如说你这块呢,哎,少一个小括号啊这个这个关键词没写全呀,是吧,Select少个T呀,哎这个呢说你不合法,这个呢是语法上的,而我们这里边指的说从一个合法性的状态到另外一个合法性的状态,咱们指的是这个叫语义上的。
11:02
哎,同学就懵了,老师你说语法上还清楚,语义上是什么意思啊?哎,说的直白一点呢,就是满足咱们现实当中的这些约束。啊,就在我们现实当中呢,你这个具体的这个场景是吧,你得是合规的啊,这就是我们所谓这种语义上的,你是一个合法的状态。啊,这个大家注意一下啊,那如果说你要是合法的呢,诶,那咱们这就认为你是一致的啊,你要是不合法啊,不满足这种合法的状态呢,我们就认为呢是不一致的,不一致怎么办呢?那你就回滚回滚到这个最初的状态就行,体现呢,这就是一个原子性的一个特征,对吧?好,那这块我们来举例一下,看看怎么叫这种合法不合法啊,那你比如说我们这个A呢,有账户200块钱,然后呢,他呢转账300块钱给这个B账户啊,那时候想你这个账户里边呢,咱们说最起码呢有个规定,就是你得大于等于零对吧,你可以把你200块钱都取出来,但是你不能多取啊。啊,你又不是信用卡对吧,哎,那这时候呢,我们说呢,就不让你转账成功,哎这个没有转账成功啊,这个原因呢,我们就归结于呢,他没有遵循这个一致性。
12:00
啊,因为你这是不是一个合法的状态对吧?哎,你一开始200是合法的一个状态,但是另外一个状态呢,叫负100,这个就不是合法的状态,不满足现实世界中的约束啊好在这呢,举这个例子二。说这个A账户啊,有200块钱,他呢转账呢,50块钱呢,给这个B账户啊,A账户呢扣钱了,B账户呢,因为各种意外呢,没有增加,诶说这时候不行,这时候你得把这个A账户的50块钱你得给人家退回来啊为什么呀?啊我们说呢,这也不满足你这种合法性的状态,为啥呢?啊因为呢,我们这里边的规定呢,就是你A账户跟B账户呢,他俩的这个金额总数应该是一定的,对吧。啊,你这块呢,转账50给了B了,那他俩加一起的总数还应该是那个数,但是你这块呢,加一起不是那个数了,总额变了,诶你这也不算是一种生活当中这种合规的这种状态呀,哎,所以这呢就也不满足这种一致性的状态。啊,我们说从一个合法性状态到另外一个合法性状态,你最后那后边的合法性状态呢,跟前面的不符啊,跟现实不符。啊,不行。然后举例三是吧,说呢,在我们这个数据表当中啊,咱们把这个姓名啊,诶设置成是这个唯一性约束了啊杨爱金呢,就这个性名呢,不能相同对吧?哎,这时呢,事物进行提交或者事物发生回滚的时候呢,发现呢,诶我们这个表中的姓名不唯一了。
13:11
不唯一了啊,只要你这块呢,去操作的时候,导致我们这个不唯一了,那不好意思了,这个呢不合法。是吧,不合法,那接着呢,我们就破坏了这个一致性的要求啊,这样的情况行啊,通过我们这样几个例子的话呢,大家应该对这个一致性呢,应该有一个呃,比较深刻的一个理解啊OK,好,那么下边呢,我们再说这个所谓的叫诶隔离性啊,隔离性叫isolation。啊,我们后面呢,会讲这个事物的隔离级别啊,Transaction isolation。呃,这个事物的隔离性,首先呢,我们来看一看这个概念啊,它呢是指啊说一个事物的这个执行啊,不能被其他事物的干扰。啊及啊,一个事物内部的操纵呢及使用的数据对并发的其他事物啊,得是隔离的。并发的啊,其他事物是隔离的,那么并发执行的各个事物之间呢,不能相互干扰。
14:01
这句话的话呢,大家最好你多念一念啊,熟悉熟悉啊,如果说一开始呢,你没有接触过这个隔离性的话呢,这两句话呢,你最好呢,给他熟悉熟悉啊,用自己的语言能够表达出来。呃,那么隔离性呢,你有可能没接触过,那么大家呢,如果说你接触过像比如说Java中的这种多线程的这种概念的话呢,呃,我觉得呢,也有助于你去理解这个隔离性啊,你比如说我们把这里边儿这个事物啊,啊,其实我们就理解成呢,是一个用户客户端的一个请求了,对吧?啊那当然呢,呃,有可能几个请求呢,共同构成一个事物啊啊那我们这里边呢,先把这个事物呢,大家比如说就替换成是一个咱们叫一个线程吧。对吧,哎线程,哎大家呢,如果说接触过像Java中的这个多线程的话呢,应该清楚,多线程呢,如果操作这个共享数据啊,就我们share data data是吧,哎操作这个共享数据的时候呢,我们说就可能存在叫线程的安全问题。对吧,现场安全问题,就是我们这个啊,这个用户你比如说你这个账户呢,有这个呃,比如说有这个2000块钱吧。
15:00
对吧,哎,你这个账户2000块钱,然后呢,你这是一个县城,然后呢,你媳妇儿呢是一个县城。啊,你这块呢,诶判断一下这个银行卡里边看看够不够2000啊一看呢够2000,过两天呢,接着你想把这2000块钱取出来啊,还没取呢,啊光判断了是吧,那这个时候的话呢,你媳妇呢也来啊,你这块呢,可能是拿着银行卡,你媳妇呢是拿你这个淘宝关联你的这个账户了是吧?诶他这块呢也一进来判一下想买个东西啊,这个1999,那判断一下这个账户余额够不够呢?一判断也够。啊,然后呢,诶他也进来了,进来以后的话呢,诶现在你俩呢都有可以啊,都可以呢,去减那个账户的钱啊,你这块呢,取出来2000块钱了啊,其实这时候你账户已经变成零了啊,但是呢,你媳妇这块又花了一千九百一千九百九十九。啊,那你这个账户呢,是不是变成负的1999了。哎,这就我们所谓的叫线程的安全问题是吧?哎,那关于线程安全问题怎么处理啊,那我们提到过一个,哎,用sized。啊,我们去给他呢,来做一个相当一个包装是吧?诶然后呢,我们这个啊A用户呢,你在操作这个共享数据的过程当中,那其他的这个线程呢,是不允许来进行操作的,我们保证这个线程是一个安全的,对吧?那这里边呢,我们涉及到了情况呢,就是咱们改成这数据库中的表了,对吧,那你比如说这一条数据呢,我们现在这一个事,咱就不叫一个县城了哈。
16:16
咱们叫一个事物了,那其中一个事物的话呢,他在操作这个表中的数据啊,你可能进行增删改操作了啊,原来人家是100,那现在你改成200了啊,这时候还没提交呢是吧?哎,你说我们这时候又个师傅过来了,你说我这时候查询,我是查出来100啊还是查出200啊,是不是这时候呢,就涉及到这种隔离的级别了呀。啊,这就称为这种叫隔离性,哎,对并发执行的其他事物呢,得是一个隔离的啊,互相之间不能干扰。啊,就是这样个场景啊,下边你看我又举了个例子啊,说假设这个A账户啊,就是我们下边这两个场景啊,说这个A账户呢,有200块钱。啊说这个B账户呢,没有钱零,现在这个A账户呢,往这个B账户呢,转两次钱,每次转50块钱,诶我们看看这里边儿呢,这个隔离清场这块我们怎么去体现啊,这里边这个问题。
17:01
啊,这呢是我写的其中的一组操作啊,咱不是转两次嘛,这个是A减了50,然后B呢加50,然后再执行一轮对吧?好,那这呢,我们用两个事物呢去体现啊,每个事物的话呢,就是转账50啊一轮,好那比如说我们首先呢,通过这个事物一来看事物一的话呢,首先从磁盘上呢,把A账户这个余额呢,读到这个变量A当中,诶200块钱。然后呢,我们执行这个减去50块钱这样一个操作,那执行完以后的话呢,我们再把这个A的这个值啊写入到磁盘当中,那这时候A就变成一百五了。没问题,然后接着我们从这个磁盘当中啊,把这个B的这个余额呢,读到这个,呃,内存当中啊,放到这个变量B当中,然后这时候呢,B是零,然后呢,给他加50块钱。注意这时候加的50块钱,我们是不是还是在这个内存当中给这个变量设置为值50对吧,还没有呢,把这个B的这个值啊,写回磁盘当中的。啊,那如果说你这块呢,是写回磁盘了以后,然后呢,我们这时候呢,再执行这个12,那其实呢就没有什么问题。
18:00
啊,大家也能想到,那肯定没啥问题是吧,关键的就是这时候呢,我们这个磁盘中的这个B的值呢,还是零呢,我还没有往回写呢,啊还没往回写呢,这个时候的话呢,我们另外的一个事物呢,就进来了。这个事物的话呢,先去读取啊,从这个磁盘中把A账户这个余额呢读到这个变量A当中啊,然后呢,这个因为你之前写出过是一百五了,所以这会儿读进来了,是不是就150了,然后接着呢,执行这个减50的操作,然后再写回去,这时候呢,A就变成100了,那A呢就变成100了,然后呢,我们再把这个磁盘中的这个B的这个变量值呢,读到这个内存当中,注意这时候我们这个事物音呢还没有回写到磁盘中呢,所以导致磁盘中这个B呢,是不是还是零啊。哎,还是零好,然后呢,我们给这个B的这个值呢加50,那这时候就变成50了,诶变成50之后呢,哎,这个时候呢,你不管是他先回血也好,他先回血也好,这已经不重要了啊,你要这个试块呢,先回血呢,是把磁盘中的这个呃B呢从零改成50的,然后呢,你这块呢也回血,把50呢又改成50了。那你要是他钱呢,就是他呢从零改成50,然后这个呢,从50改50是吧,哎,总之最终的结果呢,就是说我们A呢100块钱,B呢,哎B最后还是就50块钱了,那加一起呢,是不是少上少了50块钱呀,那这就相当于我们这时候在处理这个事物的时候呢,就出现问题了,那这个问题呢,我们理解为呢,就是因为隔离性这块呢,没有很好的去遵守。
19:19
啊,你这相相应的相互之间相当于有有过这种干扰问题,对吧?啊,那针对于这个隔离性的问题啊,咱们第三节重点谈的都是这个事儿。这个事儿呢,是非常重要的一个事儿啊,非常重要的一个事儿。行,那这块呢,我们暂且呢,先把这个隔离性呢,先理解到这儿啊,这个我们隔离性呢,就是这句话大家去体会一下,然后呢,我们再说一下,这个叫持久性。啊,应该说呢,我们a cid当中最好解释呢,就是A原子性和这个B呢,叫做持久性啊,所谓的持久性呢,就是一旦我们这个数据要提交的话呢,那你对数据库中的改变呢,就是永久性的啊,你比如说AA呢,给BB转账,我们一开始说的这个钱转了100块钱也转成了,转成最后的话呢,那我们就肯就提交了,提交以后呢,这个数据就改,就就持久的改,改下来了啊,你要这时候A说说哎呀我后悔了,这100块钱就不应该给他转。
20:08
那我想把这100块钱要回来,那你说这时候呢,从这个事物的角度来讲,还能解决吗?哎,注意呢,就不能解决了。啊,相当于你在这个操作之前呢,我把事物开启了,然后执行完一条啊,这个时候呢,你还可以反悔的是吧,但是你又把这条也执行了,这时候我们commit了,注意这时候就不能再反悔了,你只能说呢,你说呃,这个BB大哥是吧,这个生活我这有点困难,你你再给我转回来吧,诶这时候注意你再转回来,相当于又开启了一个事务啊,去给你再转回来100块钱,那就另外一个事物的事儿了,对于我们当前这个事物来讲,我们已经修改了,那这时候呢,他就被永久的保存在我们这个磁盘上了。啊,就不能改了,这就叫永久性的意思。不会随着你数据库的这个故障等等产生任何的影响啊OK,那么关于这个呃,持久性或者叫永久性,它的这个保障呢,我们说是通过这个事物的日志啊来进行保障的,那我们下一章的话呢,诶就来讲这个关于事物的日志,那日志这块呢,我们主要讲的其实就两种,一个呢叫锐度日志啊,叫重做日志,一个呢叫做安度日志啊,成为呢叫回滚日志。
21:11
啊,那我们这里边呢,主要想强调就是这个重做日志啊,比如我们这个数据呢,进行修改了啊,内存的数据呢,进行修改了,首先的话呢,我们会把这个修改呢,记录到我们这个重做日志当中啊,叫做履度日志,对吧?然后的话呢,我们以相应的一些策略啊,咱们在上一篇的时候,咱们不是讲过相关的一些参数嘛,就服务器的一些参数设置,其中就提到过这个参数,咱们这个下天的时候再重点去谈这个什么时候去刷盘这个事儿啊,刷盘这个事儿啊,那么这个好处是什么呢?就是使得呢,即使我们数据库这个系统崩溃了,那我们数据库呢,重启以后呢,咱们也可以呢,从这个重做日志当中,诶把你做过的这样的一些操作呢,再诶读取出来,然后呢,再去执行啊,相当于呢,就具备这种持久性的一个效果,对吧。哎,这个注意一下。呃,那下边呢,我们做一个总结啊,说这个acid呢,是事物的四大特征,在这四个特征当中啊,说原子性呢,是基础啊,确实是基础就是体现的就是我们这个事物啊,就是一个整体啊这个基础哎,隔离性呢是手段啊,我们要保证呢,整个这个事物呢,它在操作过程当中啊,对其他事物呢,它是这个隔离的是吧,它是一种手段,然后一致性的话呢,是我们的约束条件啊,从一种状态呢,合法性状态到另外一种合法性状态,然后最终呢,我们是为了保证这个叫持久性。
22:21
啊,因为你的操作呢,咱最终目的呢,是希望呢,他能够,诶对我们磁盘中的数据呢,做真实的一个修改是吧?哎,这就是持久化的一个事儿啊。好,那么咱们可以这样去说哈,这个你说事物是什么呢?其实相当于我们就是在解释a cid,呃,也就是说呀,咱们针对于这个数据库中这个数据的一些操作呀,咱们其实就想让他体现这四个特性,那只不过这四个特性的话呢,我们用一个词儿呢,来做了一个概括,哎,我们就用的这个事物这个词,所以一提到事物的话呢,我们就会提到有这样的四个特性。啊,这个注意一下。行,那这呢,咱们就关于这个事物的a acid这四个特性的一个说明啊,这是比较重要的一个事儿,然后咱们这个第三个点的话呢,咱们就来重点关于这个隔离性呢,来进行一个说明。
23:08
好,那我们再往下讲这个,呃,隔离性啊,具体内容之前啊,咱们再谈一个基本的概念,叫做事物的一个状态。啊,说事物的一个状态啊,事物的一个状态,就比如说我们以刚才这样一个转账这样一个行为来讲啊,我这块呢,截个图。对吧,哎,以这个行为来讲,好,我们来去体会一下这个事物的这个状态是什么样子的。那第一个状态呢,叫做活动的啊,叫active,说事物对应的数据库操作呢,正在执行的过程当中,我们就说该使用的出去活动的这个状态,你比如说我们现在正在操作这个第一条这个语句啊,以及呢,我们把第一条语句操作完以后呢,呃,正要执行第二条语句,那么这个过程啊,正在执行的这个过程,这个呢,就表明你是一个活动的状态。啊,这个很好理解啊,然后看下一个叫部分提交的这样一个状态,说当事物中的最后一个操作执行完成了,但是呢,由于操作呢,都是在内存中执行的啊,并没有对我们这个磁盘中那个数据呢产生影响啊,就是在我们刷新数据到磁盘之前,我们就成为了叫部分提交的状态。
24:08
诶注意咱们这个事当中是不是就只有这两条语句了,那有可能一个事物当中,哎,你要是复杂一点,是不是有可能会有多个这个,诶电猫这个操作是吧,你比如我这块呢,假设呢,是不是有四个呀,哎,那么在这个四个的执行过程当中,是不是就活动的状态对吧,那一旦呢,我们把第四个的执行完了。第四个执行完以后的话呢,我们这时候呢,只是对内存中的这个数据呢,做了一个修改,咱不是把这个表数据呢,是不是都得以数据页的方式呢,加载到我们这个内存里边嘛,对吧,这是我们还没有呢把这个数据呢刷盘到我们这个磁盘上,诶此时呢就叫做部分提交的。哎,就要部分提交的啊,行,那么接着往下看啊,接着往下看啊,这里边呢,有个叫诶诶或者先说这个叫提交的吧,这个比较简单,咱刚才不是提到叫部分提交了吗?什么叫提交的呢?就是你把这个处于部分提交这个状态,这个事务中的这个数据,诶修改啊,同步到我们这个磁盘上。
25:01
啊,那这时候呢,其实就进行了一个持久化呗,啊那这时候呢,我们就成为呢,你是一个提交的一个状态啊,这个很好理解,就是相当于我们这个部分提交的下一个阶段,是不是就是刷盘这样一个操作啊,你已经刷新到磁盘上了,这就要提交的这个状态。啊,这呢,其实就是我们事物的一个最终状态之一。就相当于这个数据呢,诶就相当于执行完了,最终呢,是不是修改磁盘数据了,这就要提交的是吧,这是他最终的归宿之一啊,那除了这种情况之外呢,还会出现呢,叫失败的这个状态。看一下说当事物啊,它处在这个活动的啊,就我们这个哎,或者叫部分提交的啊,这样状态的时候呢,有可能啊,就会遇到一些错误啊叭,如你数据库自身的错误啊,操作系统的错误啊,或者直接断电呀,诶等等,导致呢,我们无法继续的执行下去,你下边不是该刷盘了吗?没刷成啊,哎或者人为的我们导致当前事物呢,不能继续执行了,我们就说呢,这个事物呢,处在这个失败的状态了。啊,它是有可能是从活动的状态直接奔到失败的,也有可能是从这个部分提交的这个状态还没有刷盘的是吧?哎,也是直接奔到失败的了,哎,这就是这样的一个状态啊,叫失败的状态。
26:12
那么失败的状态的话呢,我们接着再看下边一个叫终止的啊about啊,说如果,如果这个事物执行了一部分而变为这个失败的状态了,说白了就是我们现在没有走到这儿。啊,你现在到失败了,那么到失败以后呢,怎么办呢?我们要保证咱们提到的那个一致性吧,对吧?哎,你这个数据呢,得从一个合外性状态到另外一个合外性状态啊,你得保证你的原子性啊,那这时候呢,就意味着我们需要把已经修改的这个事物中的操作呀,是不是叫还原到15执行前的一个状态。对吧,还执行前的状态,让我们成立一个整个这个还原的过程呢,或者叫撤销的过程呢,叫做回滚。啊,也就是说我们那个终止的状态呢,其实就相当于是在你遇到失败情况以后,诶,我们做的一种处理方案是什么呀,就是终止啊,你把这个数据呢,回滚回去。啊,所以说呢,我们关于事物的最终的状态呢,还有一种情况,那就是终止的一个状态。
27:04
那只有这两个是我们这个事物的一个最终的归宿。啊,最终归宿其实呢,跟我们前面讲这个是不是就一致啊,我们说呢,诶要么呢,你都执行成了,那我们这个数据呢,更新就是个持久化的这种,其实对应的是不是就是提交的状态是吧?要么呢,你要是执行了一半之后呢,诶出现了叫服务器宕机了,这个服务器宕机其实就相当于是我们导致出现失败的状态了,那怎么办呢?诶你得把你已经做的这个操作呢,再回滚回去。啊,回滚回去呢,我们把这个回滚回去以后的这个状态呢,称为叫终止的状态。所以呢,我们这个事物的话呢,是不是就只能有两种状态啊,或者叫两种这个最终的这个宿命是吧,要么就是提交的状态,要么就是终止的状态。哎,这个呢,注意一下啊,就这两个啊,二选一行,那么大家呢,把这个呢清楚一下啊呃,那么关于我们这个事物提到的这个AACI这个属性和这个事物的这个状态啊,咱们就说到这儿啊,大家能理解理解。
我来说两句