00:00
各位同学大家好,刚才呢,咱们完成了用户买书的例子,并且添加了事物最终测试,也看到了事物回归,那下面呢,我们继续来演示大家看啊,我刚才在service类上加了一个注解这个trans,然后在注解里边大家看啊,这个注解中呢,有很多相关的属性,通过这些属性咱们可以对事物做进步设置,那我下面呢,就来讲一下里边这些主要的属性,在这个transactional里边属性该怎么进行设置,那咱们来看一下它的属性。首先做个介绍,然后咱们进行演示,大家看第一个属性,这个属性叫read only,什么意思啊?是表示是否只读,也就是说这个值如果说你改成处,那咱们只能做查询操作,而不能做其他操作,这是里边的第一个属性。然后再看第二个叫timeout,表示超时,比如说它默认是负一,就是永不超时,当咱把它的值,比如说改成三,表示三秒,当你三秒还没有完成操作,那就直接抽时进行回滚。
01:16
然除了这个之外,大家再来看啊,你看下面有这几个for等表回滚置常回回滚,不管你是通过类的全路径还是通过class都可以进行设置。然后除此之外,里边还一个叫isol,它表示事物的隔离级别,还有一个叫provo,表示它的传播行为,所以咱主要介绍里边的这些属性,那我把这些呢在图里边给大家来写一下。首先第一个属性叫是否只毒。
02:03
这是第一个,那它是什么意思呢?我在里边写一下,然后咱们马上进行演示。它就表示如果说啊,咱们设置成只读属性,就表示你只能做这个查询操作,或者说只能查询,而不能做这个修改添加删除这些操作,这是第一个属性,然后里边还有第二个叫做超时,也就是说现在默认肯定是负一,就是不超时,当咱们在这个设置的超时时间之内。咱们这个操作如果说啊,在这时间之内,这个操作一直没有完成啊,没有完成,比如说12乘三秒,三秒没有完成,那就直接抛一场,直接进行回滚。啊,他就抛出异常回滚,这是第二个叫超时,然后第三个叫回滚策略。
03:04
什么叫回滚策略呢?就是咱能设置啊,哪些异常不回滚,然后哪些异常进行回滚,通过它我们可以进行设置,这个叫回滚策略,然后除此之外还有下一个,它叫做事物的隔离级别。通过隔离级别,我们可以解决就是里边几个毒的问题,比如说脏毒,不可重读,虚毒,或者说叫换毒。除此之外,里边还有最后一个叫事物的传播行为,比如说我现在一个事物方法调另一个事物方法啊,就是你事物这么写方法之间的调用,这事物该如何进行使用,比如说我A调B,那这过程中这事物是使用A的还是使用B的,还是合并,还是建个新的等等,通过传播行为我们能进设置,所以以上咱究了说明以上的五个基本的属性,只读超时回滚策略,隔离级别,还有传播性为。
04:13
这各位先知道啊,那下面呢,我们来演示一下,首先我们先演示第一个在这个注解transactional里边。加上一个叫read only,这个值呢,比如现在啊,我把它改成true,就表示目前就是只读,比如说你只能做查询操作,那咱们现在把这个代码执行,咱看目前会有怎么样的一个效果啊,咱来试一下啊。然后这里边呢,为了效果明确,这数据我先稍微改一下,比如说出的这个库存200,然后用户的这个余额咱改成100。为了咱们啊,就是。方便我们操作。这个啊,我们先写这么多,然后咱们做个测试啊,看目前什么样的效果。把这个方法咱们执行一下。
05:03
大家看啊,里边会怎么样?然后大家看啊,这里边是不是就报错了,咱们看他报的什么错,这里写到啊,说你当前的操作怎么样,不被允许,为什么?因为目前你是一个read only,就是你只能做查操作,但是我刚才操作中大家也看到里边是不是有修改操作,所以它就不被允许进行,这就是第一个属性叫read only,只读,大家把这知道啊,比如我课件中写到的这个地方。只能做查询,涉及到写操作,比如添加、修改、删除,它就直接报这个错误。然后之后我们再引着第二个叫超时,给大家写一下啊,比如现在我加上一个属性叫t out,它的值呢,默认负一,负一就代表永不超时啊,就是他没有超时这个限制,但是现在为了演示效果,我给他改一个,我改成三。
06:01
这什么意思呢?各位记住啊,这个超时设置,它里边的超时时间单位是秒,当咱们操作过程中,如果说在三秒还没有响应,那它就会超时,这个时候我们来试一下这个效果啊,为了效果明确,我这么来做啊,在里边我这里加一个注释啊,来个土度,咱是为了模拟这个超时的效果,所以咱们这么来做啊。加上一个time union点上,这个叫second点上。比如加上一个五。我们这个代码呢,让他这个五秒。然后这里边肯定超过了这个超时时间三秒这个限制,咱看他会怎么样,注意我这是模拟一个场景啊,咱们设成三秒,我这里死离我五秒,肯定超过了三秒,如果效果正确,你会会抛异常,然后进行回滚,那咱们试一下这个效果怎么样,我把这个执行大家看结果。
07:09
等他执行。这里边有一个五秒啊,咱需要多微等一会儿,然后大家看最终是报错了,大家看他报这个错了,很明确什么错误事物是不是超时了,就是你三秒还没有响应,他就直接超时了,这是咱们演示的一个效果,因为现在都加了事物啊,他肯定做了回滚,里边这个肯定没有变化。第二个超时这各位知道,然后第三个我们来看一个叫回滚策略,什么叫回滚策略呢?给大家说一下,比如现在里边有这么几个属性,一共有四个,这两个设置哪些异常可以回归这个设置,哪些不回滚,那咱就直接来一个不回滚场景,什么场景呢?我就按照我课件中的例子啊,来这么来演示。比如说我现在啊,我在我们这个代码里边找到这个啊,在我的代码里边,我加上这么一段内容,大家看我加这个内容。
08:10
就是让一除以零是不肯定有异常,咱以它为例做个说明啊,这一段我先注掉,然后这个怎么做,比如咱约定啊,当我这边有异常,让它不进行回滚,就让这个异常不回滚,这个异常呢,应该就是它说这个不能处于零的这个异常,那咱们做个操作,看怎么来做啊,在这里边呢,把它去掉,咱们加上一个这个。你看啊,叫no。或者加他。Back for第个写上的,第二个写上类写这是异常点上class,然后它就表示当我们出现这个异常,它就不进行回归,这是我们看到这个特点啊,然后咱们把效果我们来给他试一下,看一下它是怎么一个结果,呃,这个余额啊,还是改成200万啊,这么看着更明确。
09:13
然后咱看一下啊,余额200,这个书库存是200,那咱们试一下这个效果。把这个执行看他最终怎么样啊。大家看啊,里边抛了一场,就是咱刚才这个一场,但是咱看这个数据啊,先看书的库存199,再看用户余额是不是100,减了100,证明咱们现在就算出了异常,是不是也能买这本书,因为咱们设置了当我出现这个异常,它就不进行事物的回滚。这是咱们啊说明的这么一个属性,就是回滚的策略啊,当然这过程中你也可以写你的权利名都是可以的,我就以它为例,另外你能设置哪些K进回滚啊,通过这个也可以做到。
10:03
这个是我们说的这么一个属性,然后之后我们继续来看啊,下一个部分叫什么叫隔离级别,然后隔离级别是什么呢?给大家解释一下啊,咱先说一下这个属性该怎么去写,我们看这位置,比如现在啊,我在里边这样一个属性,这个isol。等于里边的就是各种的级别。就是各种的级别啊,他的级别有很多,比如说咱们给他写一下啊。大家看啊,有这么多,比如说第一个默认的就是数据库默认的,包括里边有这么几个级别,那这个给大家介绍一下,它到底是什么意思,我们来看一下啊。首先各位要注意啊,就是咱们数据库里边,包括我们说到这个事物,事物中的有一个特性,刚才咱说过叫隔离性,就是事物之间不产生影响,而这个时候如果说咱们不考虑隔离性会产生三个毒的问题,这属于基础知识。
11:09
因为咱重点不是讲这数据库啊,但是这里边我们也提一下,有三个读的问题,脏读、不可重复读和虚读,虚读也可以叫换读,那什么意思呢?就是脏毒,指的是两个事物都没有提交,但是它互相改,数据都能看到,这叫脏毒。第二个叫不可重读,就是一个事物没有提交,另一个事物修改之后已经提交了,然后他能读到他修改之后的数据。第三个叫换读,它什么意思呢?表示一个事物没有提交,一个事物提交了,但是他做了添加,把它添加的数据可以读到,这个叫脏读、不可重复读和区读,或者叫换读。这各位明确,而这个三毒的问题,咱们通过设置数据库的隔离级别可以解决,数据库隔离级别在MYSO里边有这么几个级别。
12:00
大家看啊,这么几个Oracle里边对应也是这么几个级别,然后它的级别中注意啊,MYSO中默认级别叫repeatable read Oracle里边是它上面这个级别啊,它的级别不一样,然后他们能解决不同的问题,就这里边提到的啊,这大家给知道一下啊,咱们在这个spring里边通过这个属性能设置隔离级别,比如咱们写成默认的,那默认用买SOHO的级别。包括设置它的其他级别,这个级别中特别说明啊,就是我们。按照这个过程啊,它里边最后这个级别应该是它能解决所有问题,但是它效率最低,因为它叫ciable,是一种串行化方式,它不知并发,所有问题都不存在,而第一个级别所有问题都会产生,在这个各位给他知道一下啊,至少各位记住,就是默认的my soul中这个repeatable read隔离级别。
13:01
这是我们提到的里边的这个属性事物的隔离级别。这个我们说到这里,然后之后呢,我们继续来看啊,在属性中还一个属性叫做事物的传播行为,那这个啊,给大家我这里来特别说一下啊,就是这个传播行为。咱们来写一下啊。在我们的这位置。这叫隔离级别,然后找个传播行为,它叫。然后在里边加上你不同的传播行为。他的传播行为中默认是这个块的,然后说一下什么叫传播行为,给大家解释一下啊,比如说我现在啊,有两个事物方法,方法A,还有方法B,当我A在调用B的过程中,这事物该怎么去用,是两方事物合并到一起,还是用A的,还是用B的,还是新建一个事物,这个叫传播行为,就是两个事物方法调用过程中,事物该用谁的,是用你的,是用我的,还是谁都不用,还是建个新的,还是两个合并等等,这个叫揣摩行为。
14:11
这各位要明确,此文里边的知识有这么七种传播行为在里边,咱用的最多的主要是两个,第一个默认的,然后第二个叫new,这两个特别来说一下啊,先说一会演示什么意思呢?它就表示支持当前事物,如果不存在,就建个新的,什么意思呢?比如说我现在啊,你可以这么理解。我A去调用B,把B是不是拿过来了,那我当前如果有事物,那就用这个事物,如果没有事物,那就建个新的事物,这个叫块的,还有一个叫块的new,这是什么意思呢?它表示开启一个新的事物,如果一个事物已经存在,那就将这个存在事物挂起,说的通俗点啊,不管你当前有没有事物,它都见过新的事物,然后新的事物和之前事物不存在嵌套关系,之前事物会被挂起,它都用新的事物进行执行,这个叫request new。
15:17
大家看这词就能看到,那都是新建,这是两个常见的传播行为和new,如果当天有用当前的,没有的话就建个新的块子,New不管当天有没有都建新的,建新的事物跟之前事物不存在嵌套关系,之前事物会被挂起。这是两种传播行为,大家把这两个重点记住。所以这是我们提到的传播行为的这个属性。
我来说两句