00:00
我们来看一下数据库的事物。在数据库中,所谓所谓事物是指一组逻辑操作单元,使数据库从一种状态变到另一种状态。那么我们前边的话呢,讲二口的时候讲过是吧,事物一组操作,要么都成功,要么都不成功。事物的操作,先定义开始一个事物,然后对数据做修改操作,这个时候如果要是提交的话,永远的保存下来,我们当然还可以进行回滚,所谓如果全成功,比方说我有五个步骤是吧,这个五个步骤都做完了,提交。只要有一个没做完的话,而且比方出异常了是吧,这个时候就回滚。
01:02
为确保数据库中数据的一致性,数据的操作应当成是离散的、成组的逻辑单元,当全部完成时,数据的一致性可以保持,而当这个单元中一部分操作失败,那么整个事物应视为错误。所有从起始点以后的操作都应该退回到开始的状态,这就是我们所谓的什么呀,要么都成,要么都不成,都不成的话就是回到了最开始的状态。就这个意思。看一下事物呢,有四个属性,我们有的时候也说为呃,事物的酸性,Acid,原子性,一致性,隔离性、持久性,外面一个一个看一下原子性,事物是一个不可分割的工作单元,事故中的操作要么都发生,要么都不发生。
02:01
一致性事物必须使数据库从一个一致性状态变到另外一个一致性状态。什么叫一致性呢?比方说以前是吧,A账户有100 B账户有100,然后A给B汇20块钱。A变成80 B变成。120,那这个时候的话呢,这个呃,总的钱数是不变的。这叫从一个一致性状态变到另外一个一致性状态。一致性三、隔离性。事物的隔离性是指一个事物的执行不能被其他事物干扰,即一个事物内的操作及使用数据库对并发事物应该是隔离的。并发执行的各个事物不能够互相干扰,言外之意就是我在多线程并发访问的时候,不能够出现数据的一致性错误,比方说哎,我正在做一个操作,然后呢,我这个操作吧,还没有提交,但是我没有提交的数据却被另外一个线程读取到了,而且也使用到了,这个不行。
03:17
我们拿这个一个银行卡一个折,呃,去这个买东西,然后的话呢,我这银行卡付钱的时候啊,这个时候网络稍微断了那么一下,然后另外一个拿折去弄的时候他怎么了,他就不能够操作,这个时候必须得等着的,这个要么操作完,要么就是没操作完,那你要一刷的话,比方说一共是有1000块钱,用卡花了1000,用折也花了1000,那不出问题了吗?这个时候这两个事物应该是被隔离的。持久性,一个事物一旦被提交,他对事物中的数据的改变就是永久性的,接下来的其他操作都不应该再对它产生影响,就已经完事了,是吧?所以说啊,应该保持一个持久性啊,原子性,一致性,隔离性,还有个持久性做一个了解。
04:09
好,JBBC的事物,那我们前面我们在这个凹口里边用P和develop,我们做的时候呢,也是用的commit low back,那这里边我们也一样,我们看首先。我们以connection的set auto commit方法。为事物的开始就是不让他进行自动提交,然后我们可以通过commit提交事务,通过roll back回滚事务。看效果,首先呢。有一个优点,把优点自我改一下啊,更改数据表。我来写一个。
05:02
好,我大概写个ID。好了,把这个往上移。保存刷新。一汤姆有1000块钱。二因为。1000啊,那我们要看什么呢?我要让这个向款,比方说500就这么一个操作,我们看应该如何来完成。数据库事务,我们新来建一个最优点单元测试类看。
06:05
来我们来看一个这个数据库的事物啊,首先的话呢,我肯定需要一个。是就不就不用可耐什么,我们先看我们对原原始写的,我们写过一个什么,我们写过一个DAODA里是不是有个update的方法呀,啊,我来用这个的方法来写一个,说我的操作要求就是汤姆给杰瑞汇款500块钱,对。Gary汇款。500元,那这就是我们的要求哈,汤姆给杰瑞汇款500,大家看,汤姆是一,杰瑞是二。不等500。于是我这样来写。GDBC。
07:04
好看da.update circle。八的circle等于。Update。No。在等于。减问号直接写了啊减500。Where ID等于一第一个人后边不写了。再写一个circle等于。跟这个差不多,复制过来CC来C,这是加500。ID等于二。
08:02
好do.update并没有。这挺好的哈,跑一下。嗯,看笑话。成功没问题,没问题好了,那。数据库事务到这块的话呢,我们就讲完了是吧,很明显不可能嘛,对吧,嗯,款这个我的。嗯。那你的I等于十除以零好了,这个时候第19行是不是会抛一个,是不会抛一个,这个数学异常啊,如果要出异常的话,我如何保证?
09:03
这个操作会回滚到最原始的状态。打过来一千一千,哎,我们要求就是我如何啊,要求这个数据回滚到最原始的状态。行,先看下效果吧。出异常了,这呢数学异常看。扣500没加上这什么就违反了一致性,数据的总和不对了,好了,那我如何保证这个数据能恢复回来啊?目前啊。那想想哈,目前是这样的,我目前我调这个update方法的话,我每次都是不是获取一个新链接啊啊,我每次都是一个新链接的话,这是两个完全不同的链接,没办法做事物,所以说关于事物的第一点就是关于事物啊。
10:05
关于事。第一个问题啊,如果不可操作。每个操作,每个操作使用的是同一,呃,使用的是自己的,单独的链接,无法保证食物的,无法保证食物。我们希望什么,我们希望多个操作,要么都成功,要么都不成功,你现在的话呢,我这个操作跟这个操作是不是孤立的呀,没法没法保证。没法保证这是一个失误。
11:05
那所以说有一个要求,就是我们得使用同样的链接,所以说我们前面讲了说啊,这个方法是第一个版本,为了保证事物的话,这个connection应该是被传入的,但是起码应该保证多个update,可以用一个connection,也可以用不同的connection,你要这么整的话,是不是都都是单单独自个的connection呢?没有办法来保证事物的操作,所以说这个版本的不行,好了,那我们看第二个问题,那我于是我就使用同样的这个,那这个的话呢,暂时先。来。且吧,等于now statement等于。那或者是我们,我们亮了起来。
12:02
我们不是有什么,我们不是有这个方法吗?把这个方法复制过来。我们自己来写一个争抢版本。没事。怕啥呢?说connection是从外边传进来的。那这就不要了,既然从外边传的话,你就不能关吧。不能关,关的话呢,应该交给外边来处理,因为外边可能还用它的,好了这回再看。于是connection等于。好了说啊,Gpc tools.release now no connection。一点一点好看什么呢?我进行update。
13:06
Connection b不用写。来,Connection等于ABC.get connection好了,第一个链接,然后操作circle第一个。C、拿过来。上。好,这是第一个,我们再看第二个。这个是加2CTRLC。我来打开。好,这是第二个。看着哈,Update。Connection circle行了,这个时候这个好处的话呢,就是说我这两个操作呀,用的是同一个。Connection,用同一个connection,你如何保证我是事物呢?本身有方法看着说开始事物。
14:11
开始数调用一个connection。在这。下下这啊,开始事物调用一个set auto commit。是false是什么?取消默认提交。取消默认提交,一会我来说什么意思,如果都执行完的话,我就让他提交事务怎么写啊,Connection点很密集,如果出现异常的话,我就让他回滚事务。
15:04
好点O。有一常在catch。啊,这就是我们事务的操作,第一个我们说一下这个默认提交,默认我进行一个update之后啊,只要这个成功了,他就提交了。那你这个时候你是不是根本就不能回滚呢?看一下我们的买车孔。用这个来看吧,PD。My circle。杠七进来,So use at硅谷。A select from。
16:07
啊,现在的话都是1000,我来进行一个update。You said。Balance等于balance减500 ID等于一好做了,我们记得以前在奥伯里边是不是可以回滚呢?还记得吧,我回滚一下,我再啥。是不是不是回滚不出来呀,它是什么,它默认是都提交,就是说你一上来我一做,只要我的操作成功了,提交了,所以说我们第一个要干什么呢?我们第一个要取消自动提交。只有这个时候我才可能来使用15,如果我要是一个超出就成功了,那你是不是根本就没没办法去做15万,就以说第一个干这个事儿好了,如果都成功的话,提交事,如果有出异常的话,我就回滚事物看效果刷一下你改过来啊,1000。
17:18
保存回来好了,执行一下,先先执行一下啊,好一下。大家看是不是发生异常了,我们看结果。有还什么提交了,这哪行啊,看看。哦,我这个update的方法里边,我是不是多了一行啊,76行,我是不是还是在各用每个方法用自个儿的用,用自个的connection呢。去掉要去掉吧,能看懂吗?你看我的确是在可一个connection,但我在里边的话,我是不是获取一个新的connection看不掉。
18:05
再来看。这种。异常照出zero没问题。好了吧,哎,这个时候的话呢,数据库的这个信息啊,没有发生改变,这就是我们使用事物的一个基本代码,就是最开始的时候,开始事务就是取消。啊,默认的提交行为,然后的话呢,如果操作都成功的话,提交失误,如果出现回滚,如果出现这个异常的话,会本失误,这就是我们在JDBC里边使用事物的基本格式。好具体步骤。是这样的。一。啊,15开始前。
19:01
先需要。开始是标志。开始失,开始失误是干什么的呢?即取消。的认提交为提交行为。然后方法就是他。That connection c,我们可以打印一下,看它默认是什么情况,第三,connection.get out of the,你看一下就知道了,看一下。分是不是,所以说取消好了。二、如果事物的操作。都成功和提交15和提交15,怎么提交呢?就这么一个方法。
20:06
递交事物三、回滚事务,回滚事物说错,无线异常则在钙块中。一本书,那写的方法就是这个方法。哎,这就是我们的。事物创作。首先我们让他呃开始事务,即取消connection的默认提交行为,然后呢,呃,如果操作的正常的话,提交事务,否则出异常的话,对本事务,那基本的这个代码情况是这么一个情况,我拿过来啊,大家看。
21:06
CC。往这放吧。稍微怎么看呢,这个不要。开始事物。后来。这把我们不说了啊,这个中间是一系列的操作,然后。然后提交。如要出一的这个我不。基本事物,然后的话呢,货币链接整个的这个基本的这个模板就是这样的一个模板,开始,然后开始事务,然后咔咔咔开始一系列操作是吧,提交事务出异常的话,亏本事务这会的话呢,会被连接这就可以。
22:03
好了,大家呢,也像我这样来建一个数据表,完成这个,呃,他们给介绍的一个汇款,然后要求这个方法是支持事物的,用这个模板来写一下,我现在呢,把这部分给它做起来,这是一个模板。然后呢,我们回到这个里边来,回到这个里边,我们来看一下啊,如果要是补笔不加这个的话,我们说了它是自动提交,就是说这个时候的话呢,我做完第一个操作之后就提交了,这个时候这个事物是不起作用的,看已经变了,所以说这步必须要必须要有啊。这是我们整个的这个事务操作这块的话,大家可能看到了是吧?嗯,难道说我每做一个事务操作的时候都需要按照这个模板写吗?再说一遍,难道说我每做一个事物的时候都需要来用这个模板写吗?
23:11
很明显那样做的话呢,可以是吧,但比较麻烦,我们可以使用什么样的方式让他不这样使用动态代理,让目标方法开始之前。开启十误,目标方法正常执行完的话,提交十误,如果目标方法执行出异常的话,恢复失误,这个我们在后边讲这个,嗯,生殖之事物的时候,以及讲外的logo跟filter的时候,我们会来提这件事。
我来说两句