00:00
刚才呢,我们讲了叫关于数据处理的增删改操作。下一个这个概念呢,叫数据库事物这个概念呢,我们之前没有给大家讲过,也没有接触过,这是一个比较新的,那么什么叫事物,我们先看啊,就是一组逻辑操作单元,使数据从一种状态变换到另一种状态。哎,怎么来理解啊,就是比如说我们去操作这个数据表的时候,本来一开始某个人的工资,比如说是1万,我给他更改成2万了,这是不是就是相当于是数据从一种状态到另一种状态了,对吧?哎,这叫这就叫失误啊,跟你数据库操作相关的当然就是数据库的事物,它有哪些部分构成一个或多个的DML语句,一个DDL或者DCL语句,它就构成了一个数据库事物。啊,后边呢,我们讲到这个JDBCJDBC就是使用Java语言来操作数据库的一门技术。
01:05
到那个时候我们还要更加详细的来讲这个数据库事务,这个数据库事务就有点像我们在Java基础里边讲的多线程一样,有可能有多个线程去操作一个共享数据,对吧?这呢可能有多个用户去操作同一个东西,有可能也会出现安全问题。到时候我们再详细的给大家讲,我们先这里了解一下这个通过,呃,DC,哎,就是commit呀,Robot呀,来讲一下这个数据库事物。说一个数据库事物,它一定是一个DML语句作为开始的,什么结束啊,这就是commit或者back或者DDL,因为DDR我们讲这个创昨这个上节课讲的创建表啊,修改表啊,他们都是会自动提交的,嗯,他们这个这个这个当你执行完以后,也是相当于这个事务就结束了,或者用户正常会话结束,出现异常也表示这个事务终止。
02:03
啊,这里呢,就是我们要讲的两个,一个叫一个叫robot back啊这个大家就了解一下,嗯,看这个图之前,我们先简单的给大家举个例子,关于commit跟robot的,实际上我们在刚才这一节当中给大家也也提到了是吧。这样我先看一下select星from。ERP啊,EP这里面数据已经被我给清除了是吧?嗯,那我们看这个吧,这个表呢,现在是有107条数据。我呢先给你commit一下,虽然我没有进行什么操作是吧,我现在commit相当于我现在这个数据已经保存了,自动提交了,已经是最新的数据了,此时这个表当中有107条数据,我现在呢,给他把这条数据做一个修改。
03:01
比如说把它的lastname给它改一改,这个呢应该大家比较清楚了,怎么写update employees1set。Lastname等于嗯,重新给他改个名,比如说ABC。Where employee ID等于206对吧,然后呢,更改完以后我再查询一下。最后这个人现在叫ABC,我现在进行这个操作以后,如果此时大家注意,如果此时我给commit了,是不是相当于这个数据。就给写死了呀,就一提交,那你这个就给就给定死了,假设你看大家注意一下,我给commit了,Commit以后如果你再想roll back,这个时候就不好使了,不信你看一下。
04:01
是不是还是ABC啊,相当于我们这个roll back,它回滚到哪个位置,就是回滚到你最近的一次commit之后,最近的一次commit之后已经是ABC了,所以你再回滚还是ABC。大家要明白啊,如果说你要是这样的话。比如说这这时候你back完了还是ABC,我现在再重进行一个update操作,我改成叫abcd加个D。改了对吧,这个时候改了以后,我没有给他commit,我先select一下,那就是abcd了。这个是T去了。如果我给back。因为你在这个操作完以后,没有进行一个commit,如果所以说我这个时候一周back,它就是不是给回滚到最近的一次。
05:00
你这个commit之后,最近的一次commit之后,肯定是在这个这个update之前吧,是吧,所以说这个更改将被保留,将被这个回滚。你看再看是不是就变成ABC就回滚回去了是吧,这就是我们的这两个操作啊,大家从这个图上来看的话,就是这样,当你commit以后,你再进行了一些操作,什么增删改啊等等等等这些操作,如果你1ROLL,它就roll back到你这个commit之后的这个位置。不管你在之后进行过删除啊,Insert update啊,都不好使,全部都回滚到这就是这些情况,然后这里边呢,又多了一个叫s point。C point什么意思?就是commit是表示自动提交,Point呢,就是设置了一个保存点,你从这个翻译过来也是这个意思,保存点比如说从这个图当中我们看到啊,Commit以后进行了一个删除操作。这个设置了一个保存点,然后又进了一个添加,然后修改设置了一个保存点。
06:06
然后我们这个时候如果你写入back的话,那就是跑到这儿了哈,现在我不想让你回到这,我回到你进行完第一个delete以后的这个位置,回滚到这,那只需要我们叫roll back to save point a。对吧,To point a,那么它就回滚到这儿了。你不能够再怎么着,你不能,我说我不用这个simple point,我这写成commit行不行,嗯,是行,但是你要是这写成commit以后,你再想回滚到这个位置是不可能的,而此时如果我保存到A了,你再想再回滚一下,你还是能回滚到这,相当于是我记录了是不是三个保存点呀,加上你这个commit,你想回滚到哪个位置都可以。这就是我们讲的这个叫s point,举一个例子,就拿它来举例子,大家看到我们这个表还是有206条数据,对吧?我先这样吧,Commit一下都是最新的了,206条数据呢,我删除一条,Delete from employees1employee ID等于206。
07:20
删除完以后,我这样我select count行是不是现在就106条数据了,因为删了一个对吧,删了一个以后大家注意啊,你这个需要你脑子里边要清楚,我此时commit一下。提交了,那意味这个更改是有效的,当你再进行查询,个数就是106,然后呢,我再删一个。205我一个个往前推,这个删了以后我设置一个point point a。
08:08
设置完了,设置完以后,这个时候按说我们要如果进行一个这个这个select的话,应该是2105对吧,然后呢,我再删一个。204我又删了,又删了一个,又删了以后我save point b,此时如果说我要进行一个sta的话,那就是又少了一个人104了。好在这个位置的时候。大家你注意哈,这个位置的时候,如果我进行一个操作叫roll back to save。Point a roll back to the point a是不是就应该是在你A之后回滚到那个位置?
09:09
问到这个位置的话,大家你想想这个人应该是多少个?是不是再往前退一个105吧,哎,Simple h105,那就现在回滚到这个位置了,如果我不回滚到这个位置,我就让你回滚到哎那个commit的位置,再入back一下,你再进行一个。那就是106是吧,嗯,这就是刚才我们说这个例子是一样的,就是我可以指定我回滚到哪个位置,当然是你回运到这个位置操作以后的这个这个这这块的啊。这就叫控制事物,这是我们讲的这个的第一个知识点。嗯,大家你可以看下这个操作,后边还有一个这个内容,说提交后回滚前的数据状态这个内容啊,我们讲JDBC的时候。就刚才给大家稍微提了一下,说跟Java基础里的多线程是有点类似的,嗯,这是一个,嗯,算是一个难点,但是有了这个多线程做一个铺垫的话,就可以理解了,我们看是什么意思,看这个红的啊。
10:14
嗯,其他用户不能看到当前用户所做的改变,直到当前用户结束事务。嗯,DML语句所涉及到的行被锁定,其他用户不能操作这样一个意思,假设我当前一个用户现在正在操作一个表,跟多线程这块是非常类似的,假设这个表我们就是employees这个表,现在呢,这个用户是不是叫SC的用户啊,我在SC这个用户下加的这些表。哎,SC用户这个用户现在对这个employee这个表进行一个增删改的操作。进行增删改操作,我们说了这是一个事物,那事物的结束呢,是不是你这个得commit一下呀。是吧,我commit以后才表明我这个事物已经操作完了,如果说我现在对它进行一个增删改的操作,正在正在进行操作呢,我还没有commit,意味着我还在占用这个数据表,如果此时你又来了一个用户,这个用户同样的来操作这个employees表,我们说呀,这个操作现在就是完成不了的。
11:19
原因就在于这个用户现在正在对它进行操作,也就是说其他用户不能够看到当前用户所做的改变,直到当前用户结束线程结束失误,只有当你commit以后,我才能够来继续进行一个修改,那当你进行操作的时候,就意味着你所涉及到这一行啊,被锁定,其他用户就不能够操作,这是不是非常类似于我们Java当中的多线程,当一个线程对共享数据进行操作的时候,你没有释放锁是吧?你没有释放锁的时候,其他线程是没法来继继续参与进来对共享数据进行一个修改的。好,那这个情况的话,我们怎么演示一下来,我们看。
12:04
嗯,现在呢,我都都都都给他了,我这样进行一个修改,我就看诶。我们看这个employees这个表,这个表呢。行,我们就改它吧,把这个人还是改他这个名字,现在我们操作是这个本身的一个employee这个表啊,这叫update。我还给大家起名叫ABC吧,我现在是不是对这个人进行了一个修改啊,改了进行修改以后我现在做个什么事啊。
13:13
我现在用另一个账户也来对这个表进行一个操作。谁来操作,我们打开这个PR搜购develop,我再一个用户登录系统用户。ORTL。我们知道系统用户这个权限是比较大的,所以他在不用说你在这个这个控制台这块去给我这个这个不用在这个控制台这企业管理器这给我再附一个那个什么了是吧,再附一个权限,让我去访问SC的这个表了,它本身的权限就很大。我们这大家你看哈,他是不是已经进行了一个修改,没有commit,然后我们在这进行一个查询,Select,新from sc用户的employees这个表,然后大家你注意这得加上一个for update,表明我得找你这个更新以后的数据。
14:16
我点回车。大家你注意一下,你看我这个时候是不是我点回撤以后没有反应啊。正常的话应该查询到,但是现在没有,原因就在于我现在这个SC的用户对这个employee这个表锁定了,所以你没法进行一个查询,那怎么就能够查询到了,那我得释放是吧,我得释放这个锁,所以我得一下大家我现在进行回车,你看左边这个表。就不出来了,而且出来以后确实是更新以后的数据,对吧,就说明我们这个操作就是这样的,然后你在这边呢,再试图进行一个select from employees。
15:04
你看我现在一点回车是不是又死到这儿了,原因在于你左边是不是现在正在查询,也相也相当于是进行一个操作,对吧,这个操作着呢,我就没法再修改,除非你这边给他commit。你看我这1COMMIT他出来了,就是这样的,然后你这边在commit,现在整个这个表就已经被释放了,没有没有这个任何,呃,这个这个。现在用户对他进行操作,这就是叫数据库事务的一个操作。然后后边还有说明,说只有当所被释放的时候,其他用户才可以操作你涉及到的这个数据,跟我们讲Java基础里的多线程是一个道理。后边我们讲这个。讲到这个JDBC的时候,我们还会来讲这个数据库事务的。
16:00
嗯,行。嗯,提交数据,这个我们都说了,哎,Roll back回滚这呢,我们这一节就说完了,这个红线上边就是我们的增删改,下边呢是相应的一些叫DC里边,嗯,Commit simple point back,行,我们这一节就就到这。
我来说两句