00:00
好,大家来看说事物呢是一组逻辑操作单元,一组逻辑操作单元是数据呢,从一种状态变换到另外一种状态,哎,把这呢我们就称为是一个数据库,事物来咱们拿过来呢,理解一下这个就写到最上边这了。第一个啊说什么叫数据库事务,嗯,这呢我们说了一句话,啊说呢叫一组逻辑操作单元,使数据从一种状态变换到另外一种状态。首先一组逻辑操作单元大家可以理解为叫一行或多行的DML操作。哎,所以超载就是诶一行或者叫一个啊或多个,哎DL操作。DM2就是我们通常说这个增删改查了,当然主要呢,我们指的就是增删改操作了啊,你看我们这里边,咱们这里边我说呀,AA给BB转账,这里边涉及到两个电报操作,这两个电报操作呢,它其实就构成了一个事务。
01:05
那就是这一个点一个失误操作呢,就是由这两个所构成的,那咱们再举个例子说AA呢,给BB转账100块钱,还给了这个BB了啊,然后呢,这个CC呢,呃,他给这个DD啊也转账100块钱。这呢,我们说几个事物呢,两个事物,对,因为ABB转跟CCDB转没有任何关系,对吧?啊也没有说CC也没说说说你给AA,你给BB转完以后我再转啊,没有这回事,就他俩呢,完全的是不相关的,那这里边呢,AA给BB转,这就是个事误,CC给D转啊,就是另外的一个事误,不相关的啊两个事儿,然后这每一个事儿里边呢,我们又涉及到了好几个电猫操作,这就叫做一组逻辑操作单元,好说是数据呢,从一种状态变换为另外一种状态,你比如说一开始的时候,哎,这个咱们再改回去啊,一开始的时候呢,他俩人呢,就是各自有1000块钱。
02:01
然后呢,你转账完以后呢,AA这里边少了100变成900了,这个多了100变成一千一了,原来是各1000的状态,现在呢,变成900到一千一的这个状态了,这就是从一个状态变化为另外的一种状态,哎,这就是你最终呢就是你事物呢,毕竟是DL操作嘛,肯定是状态呢,会发生一些变化,但是在这个变化当中呢,我们需要维持一定的原则,这就是我们第二个要说的说事物,哎处理的原则啊,什么原则呢?看一下这个课件啊。这呢,我们有这样的一段话,说需要保证事物都得作为一个工作单元来执行,即使出现了故障都不能改变这种执行方式,哎,下边具体来讲说,当在一个事物当中执行多个哎操作的时候,要么呢,所有的事物都被提交,哎,那么这些操作呢,修改呢,就被永久的保存下来了啊,就像咱们刚才那叫转账成功,最后呢,你提交了,那要么呢,数据管理系统呢,将放弃所做的修改,整个事物呢,要回滚到最初状态。
03:03
AA呢,给BB转账,AA减了100了,BB没收着,这时候呢,你AA的这个扣的100你还得再回滚回来,诶保证了我们要么是这种状态,要么是这种状态不能出现在中间状态。啊,就好比是咱们举一个生活能力,这是河的这一样,这是河的另外一样,你现在过去的时候呢,我们需要比如说做好几个事儿,就好比我们这里边的DML操作一样,就是你要把这几个事都做成了,你就到河的对岸了。这就算是我们最后呢,可以要提交的情况啊,要么的话呢,你执行了一半发现出问题了,这时候你再邮回来啊,那就相当于是我们把已经做的这个事呢,再做了一个回滚,哎,相当于你这个roll back的一个操作,那你就是又回到这个状态,就相当于我们这个最终这就一系列的DL操作,就是要么呢,我们这个是在你最初的这种状态这块,要么呢,就是处于这个都修改完以后的这个另外一种状态,这只能是二选一,不能在中间某一块停了说也可以这样的状态,这是不对的啊,因为我们要保证这几个操作呢,要么都做,要么都不做,为什么呢?因为人家是一个事物啊,也就是说一个事物当中的这几个DML操作呢,必须都执行,或者是都不执行。
04:10
哎,这就我们要处理的一个原则。好,CTRLC把这个粘过来。嗯嗯,这个我就到这儿啊,往横一下。哎,这么着啊,哎,这里边是因为这个markdown里边这个加粗的时候呢,都用了两个星啊,这个把它去掉了,这个大家能理解不?那应该来讲还好是吧?行,那下边的话呢,我们针对于刚才说的这个事儿啊,就来说明了啊说这里边AA给BB转账呢,明显就应该是一个事物了,就他俩要么都做,要么都不做,那你要出现异常的话呢,我们得保证这个数据呢,是不是得回滚回去啊。那下边我们就看一下我们刚才做的这个update操作,说能不能回滚。啊,这是我们说呀,现在这个事啊有困难啊回滚咱们在讲数据库的时候提到过,回滚的话呢,它也是回滚到是不是最近的一次commit之后啊,比如我们这呢,是一个电码操作,这呢又是个电码操作,这个电容操作,在这个电码操作的时候呢,我执行完以后,我执行了一个叫commit提交数据了,然后呢,我又做了两个D操作,比如说每一个D都是删除操作吧,啊,Delete delete delete,删一条数据,再删一条,再删一条,然后在这个位置我们来了一个roll back。
05:23
我要做回滚,那这个回滚呢,我们是最近的一次commit之后,那就是回滚到这了,1ID呢,就这两条数据呢,删的就回来了,这个呢就没戏就回不来了,对那现在的话呢,我们说要想执行出现这样的一个异常以后,我们保证这个呢得回滚回去,那你得保证这个操作之后哈。这么着?别提交,你要这时候操作完之后,在这时候呢,如果有个提交是不是就麻烦了,我们这块一出异常一回滚是不是就回滚到这儿了,那你这个增删改操作这个就回不过去了,那这时候呢,我们要说一下这个,哎怎么说呢,先把这个事先描述一下,就是叫数据一旦提交是不是就不可回归啊。
06:11
哎,数据一旦提交呢,就不回格了,那现在我们要关注这个问题,就是哪些操作会导致数据呢,提交了诶会导致诶数据的,我们叫自动提交吧。诶哪些操作会导致数据的自动提交这个呢?回顾一下我们讲的数据库,首先呢,我们说这个DDL操作是不是它天然的执行完以后就自动提交了是吧?而且我们做任何的设置呢,对它都不起作用啊就这DDL操作呢,诶我们说哎这个一旦执行哎都会哎自动提交,哎自动交咱这块呢,还都没有在做这个DDR操作,主要咱们做的是D操作,对吧?那D操作是什么样的呢?
07:00
增删改。包括长。诶DS呢,我们说默认情况下,它是不是也是一旦执行也会自动提交啊,嗯,但是呢,我们是不是还可以修改,对我们这块呢,说额外的一个说我们可以通过咱们当时写的叫set auto,哎,是不是commit等于false这样啊,这咱们写的是这个circleq里边的这个指令了啊,我们可以通过set auto commit等于false的方式啊,相当于是取消,哎这个DM操作的是不是自动提交,哎,它是可以的,而我们这个DDL注意是不行的啊,DDL操作你即使设置了也没用,呃,因为呢,你设了以后呢,对它也失效啊,这里边我们也可以强调一下这个,诶set auto commit等于false这个方式对咱们D码操作呢是失效的啊。诶诶,对于DDL啊操作失效,所以这个呢就别想了啊,也就是说我们要创建一个表,或者修改一个表中的字段,或者你要删除这个表,这个你得慎重,它独立的就是相当于是一个事物了。
08:08
他就自己独立一份啊,我们那个电话操的话呢,这个我们可以通过这样的方式呢,诶不让他,诶自动提交,诶取消自动提交,OK,这是一个还有吗。诶还有个这个呢,得告诉大家啊,你比如说我们在这个写这个搜库语句的时候呢,咱们也确实设置了set auto commit false,我也没让它自动提交,但是呢,最后的时候呢,我会点击这个叉,我一点叉时候呢,相当于是关闭整个是不是连接了,诶也就是说在我们关闭连接的时候呢,也会将咱们没有提交的那些数据呢,自动做一个提交。就相当于我现在呢,诶获取了一个数据库的连接了,获取连接以后呢,你做这个,诶你也设置过这个set auto commit等于false了,哎,我们这块呢,DL操作DMR操作D操作最后没提交,但是最后呢,我把这个链接呢给关掉了,你关的时候呢,他也会把你之前做的这几个事儿呢,自动的会有一个提交的。
09:00
就是最后关闭的瞬间,你说这个我们还没提交呢,怎么办呢,它会自动的帮你提交啊,这个我们在写示,就是默认在关闭连接时。哎,我们会,哎自动的提交数据,哎,这就是我们说的什么时候会自动提交,那咱们现在呢,希望说你这个事呢,是不是最好不要提交,你不要提交了,我们才有机会回滚,严爱金呢,你是不是要避免这里边的这几个事啊。是这意思吧,那这几个事是都避免还是说避免一个就行了,避免对都都得避免对吧,因为这呢是三种情况是都有可能的,就跟说嗯,怎么能交一个女朋友呢?嗯,要么呢,你就自己呢去多主动一些去去撩去聊是吧,嗯,要么呢,你就登录一些比如说第三方的一些平台,交友平台来去认识认识一些异性的或者是同性的是吧,嗯,也有很多同性平台哈,当然我就不知道了,听说有哈,哎你可以多去聊一聊,哎要么呢,你就通过你这个亲戚朋友呢,给你去介绍,哎这样的三种方式,哎能够让你有个女朋友,那现在说呢,我就不想有女朋友,那你这是既不能这么做,也不能这么做,也不能这么做才行是吧,这把这三个事儿都给他断了,这个事你就。
10:20
交不了女朋友了,哎,那这样呢,我们就得保证这三个事呢,都不能做好,都不能做,我们一个一个看看第一个DDL操作,哎,咱们这块呢,主要呢,事务里边咱们做的更多的还是DML操作,所以这块本身咱也不是DDL,所以这个不用考虑了。第二个说DML操作的话呢,默认情况下呢,就自动提交了,那我们就得保证是不是在你进行这个update的操作。的时候操作之前啊,那就得针对到这个方法里了,咱们是不是得给它加一个这个操作了是吧,不让他自动提交,哎,这个我们要避免的好,下一个说默认情况下呢,我们在关闭连接的时候呢,它就会自动提交数据。那咱这时候呢,YID这个update操作呢,在你执行完以后啊,这个连接。
11:05
不要关,因为你一关了这个事就提交了,一提交了就回滚不了了。对吧?哎,那咱们原来写这个RD的操作,你看啊,里边咱们是不是自己造了一个连接,在你执行完那个DL操作以后呢,我们是不是把连接给关了,这里边不是你自己close了吗?哎,那我一关那这事就完了,一关呢,这个连接就呃就就没办法再数据回滚了。你看就成这个意思了啊,哎,我们这里边呢,有两个update的操作,相当于我这呢叫获取连接,咱们做了一个update的操作,AA呢减了100块钱,操作完以后呢,咱们把连接给关了,然后呢,我们又哎获取了一个链接给BB呢加了100,哎然后呢,执行执行完以后呢,把这个连接又给关了,只要你一关连接这个数据呢,就被提交了,那这块呢,如果要出现异常了,你试图回滚,是不是也只能回滚到这儿。
12:06
那这个呢就回不来了,那怎么办呢?我们得这样先呢,获取个连接。这个连接里边呢,有一个DML操作,就是我们AA减100块钱,操作完以后这个连接不要关,还在这个连接当中,把这个BB这个操作呢,给它穿起来加100,然后呢,你再做一个关闭。就是相当于我们用一个连接把这俩事儿呢串起来,哎得这样子,那么如果说我们在执行在一半的时候呢,这块出现异常怎么办呢?因为你连接没有关我数据呢,还可以考虑呢,是不是回滚。哎,这样的原因,哎这个呢,大家要清楚,这是我们的难点啊,难点之一。好,这个清楚以后呢,那我们现在就需要对咱们这个update操作呢,要进行修改了,因为你原来这个写法里边呢,自己造了一个连接自己给关了,现在呢,我们是不是最好呢,调这个方法的时候呢,连接就已经有了。
13:02
哎,就是相当于从外边你看这呢框是咱们做的这个update操作啊,我们是不是相当于你调离方法的时候呢,外边给你传进来的一个连接啊,啊对的,所以这块我们要对它进行一个修改。
我来说两句