00:00
好,那下面呢,咱们就把记忆注解的声明式事物呢,它的准备工作咱们来做一下啊。首先呢,咱们需要去创建一个新的工程,然后来加入依赖,当然了,咱们就直接来使用这个工程就行啊,这就是我们刚才咱们来测试JD bc template的那个工程。好,然后呢,我们的依赖呢,咱们也不需要重新去添加啊,然后因为现在他用的依赖跟咱们在这儿用的依赖是一样的啊。Spring-context的上下文可以将我们当前咱们的什么APOC的核心依赖都引入进来,然后这个呢是咱们的spring-OM,叫做对象关系映射,那它可以间接的将spring-GDBC和spring-TX给引入进来。这是咱们spring整合g unit,然后这个是unit的加包,这个是my circle的驱动,然后这个是德鲁伊的数据库连接池,OK啊。行,然后下面大家再来看它干嘛了,它创建了一个JDBC的properties,对吧,然后在我们spring的配置文件中引入了这个属性文件,然后配置数据源,最后配置了一个gd bc template。
01:08
对吧,大家注意啊,因为我们在讲声明式事物的时候,咱们就说了这个声明式事物咱们需要在JD bc template操作,操作circleq语句的过程中,执行SQ语句的过程中来测试,所以说其实我们还是要去配置一个g d bc template的。那在这咱们怎么办呢?咱们这样来创建一个新的配置文件啊,咱们把这些东西都关掉好,然后咱们这个叫什么叫TX,然后杠an not ion叫做TX-on啊干啥的是基于注解的声明,是事物啊。好,然后这里面呢,咱们最终也是要获取一个gd bc template的啊,然后通过操作GD,通过JD bc template,然后来执行circle的过程中,然后来测试咱们的声明是事务的功能,好然后下面呢,我们需要来创建两张表,大家注意,一张表叫做T_book图书表,一张叫T_U的用户表。
02:07
然后这个呢,大家注意啊,然后它里面都有什么字段叫图书ID,图书名称价格,还有一个库存,然后这个用户表里面有个用户ID,用户名,还有一个什么呀,叫做余额OK吗?大家注意,那我们现在咱们模拟的场景是什么,是用户买书。啊,然后用户买书具体的操作是什么呢?大家注意,咱们先把我们要买的这本书呀,它的价格查出来,然后再去更新图书的库存,最后咱们再去更新用户的余额。那所以说这个时候咱们是不是就有一种可能是库存不够的情况,然后或者说是咱们的余额不够的情况,那我们在这儿呢,咱们就是通过这个在买书的过程中,然后余额不够的情况,然后来测试我们当前的声明是事务啊。好,那大家都知道这个事物在处理的过程中啊。我们最终咱们要想来判断这个事物该提交或者说是回滚,我们主要来看咱们的核心操作中是否有异常,对吧,但是呢,咱们以后在真正去开发的时候啊,然后咱们很少会是因为说我的什么SQL语句写错了,然后才出现异常来进行回滚的,会不会啊,不会,我们一般都是因为什么,因为业务逻辑的问题,然后咱们才需要进行回滚的。
03:25
就比如说咱们的库存不够,或者说是余额不够,对吧?那大家想一下,你说这两种情况它会不会报错啊?就比如说我们就设置一个int类型的这个库存,别的咱们都不设置,像这些大家先不用看啊,像什么无符号先不用看,比如说我们现在就设置一个int类型的库存,设置一个int类型的余额,对吧?那这个时候大家说如果你的库存要是不够的话,它会有异常吗?什么叫库存不够?如果我的库存已经是零了,那你还能再买这本图书,再买这本图书吗?然后像咱们当前的余额,如果我的余额都不够买这本图书,也就是你的余额还没有我们当前咱们这本图书的价格多,那这个时候大家想想,你还能买这本图书吗?不能,那所以说大家想一下,你像库存不够,那咱们你哪怕是库存为零,那我们现在再买一本书减一,那库存就是负一,那他从数据库层面来说,他会报错,不会不会,那余额的话,哪怕咱们的余额是一个负数,它是不是也不会报错,对不对?但是这种情况的话,大家说符合咱们的业务逻辑吗?不符合,你库存不够咱们就不能让你买,你的余额不够咱们也不能让你买,那这个时候大家注意我们应该怎么做,也就是说有的时候我们最终咱们要去确定我们要提交或回滚事物的时候,咱们是要看它有没有异常的,而我们当前咱们的有些特殊的情况,或者说咱们大部分的。
04:52
情况都是因为我们的业务逻辑。而产生的,而这个因为咱们的业务逻辑的问题,然后最终需要需要来进行回滚,对不对?好,但是他有异常吗?大家说像这些业务逻辑的问题,它会出现异常吗?不会,那这个时候咱们该如何去解决这个问题呢?咱们可以从两个方面来解决,大家注意,第一个方面咱们可以从我们的数据库层面来解决,第二个层面咱们可以啊,第二个方面咱们可以从咱们的Java代码的层面去解决。
05:23
比如说咱们从数据库层面怎么解决呢?大家看好啊,那我们现在咱们的库存,它就不能是小于零的数据呗,对吧,然后它一定是大于等于零的余额,是不是也一定是大于等于零,那这个时候怎么办?咱们可以直接为来为当前的字段来设置一个关键字,叫做s sand,叫做无符号,这个大家应该都还认识吧。什么意思呀,就是无负号,无符号就是无负号的意思,因为它是数值类型,它的范围呢,有一个固定的范围,大家都知道int有个固定的范围吧,是从一个负数到一个正数,但是呢,我们现在设置了无符号之后,然后它的这个值最小值就会从几开始,就会从零开始,当然它的最大值的范围也会随之发生变化,那所以也就是说,当我们设置了无符号之后,我们当前这个字段它就不能有负号,也就是说它的值的范围就会变成是大于等于零的范围,OK吧,行,那下面咱们的余额也是设置一个无符号,那大家说这个时候如果我们的库存不够,或者说我们的余额不够,那咱们是不是就能从my circle层面,然后直接去抛出一个异常,叫做circle exception对不对,对吧,因为这是咱们数据库的问题,OK吧,好,那我们这个时候就可以,因为咱们的业就可以以我们当前咱们业务逻辑的问题,然后来产生一个异常,最终来。
06:45
来实现一个回滚或提交的效果,这样的啊好,那我们也可以从咱们的Java代码的层面来解决,怎么解决呢?那不就是要一个异常吗?那没有异常怎么办?给他造个异常呗,对吧?所以说我们可以在更新库存的时候,你先判断一下库存够不够,如果够直接操作更新库存,如果不够怎么办?手动抛出一个异常,叫throw new runtime exception,手动去抛出一个运行时异常就可以,或者说大家也可以自己创建一个自定义异常也是可以的啊。
07:19
好,余额的话也是一样的,然后咱们再去更新余额的时候,先判断一下你的余额够不够,只要咱们的余额是大于谁的,是大于咱们当前的这一个价格的,那这个时候我们就可以去更新余额,而如果是小于这个价格的话,那咱们怎么办?那我们就直接对吧,然后给他手动抛出一个运行时异常或自定义异常就可以,那这个时候我们也可以来实现一个什么因为由业务逻辑而产生的问题,对吧?咱们最终呢,来使用一个这个手动抛出的异常,然后来解决这个事物的回滚或提交的效果,啊,这个大家注意,所以呢,为什么我们在这加上一个unsign,大家注意,其实就是来方便我们去处理事物。
08:02
对吧,要不然的话,你没有安三的,那大家想一下,那这个库存你哪怕给他,你哪怕给它更新之后,它是小于零的,它其实也不会报错,知道吧,所以说呢,我们的事物,咱们就需要来判断核心操作有没有异常,如果有异常就回滚,没有异常就提交,那所以我们就需要,如果是业务逻辑方面的问题,那咱们就需要从数据库层面,或者说从咱们的Java代码的层面,然后呢,来给它设置一个异常,给他造一个异常啊这个大家注意。行,那下面咱们这样啊,咱们来找到咱们的so样,然后把这个T_U在这,咱们给它干掉更多表操作,然后咱们从数据库删除表。好,然后下面呢,咱们把咱们的这两张表啊,给它复制过来,然后放在我们的这个circle样轴ctrl a,然后一个F9执行。大家注意啊,好,大家看,那我们现在这张这两张表是不是就已经创建成功了,然后现在咱们来一个刷新,大家注意这是咱们的图书表,打开大家注意这里面有两本书,斗破苍穹和斗罗大陆对吧?然后价格一个80,一个50,然后我们当前的库存呢,都是100,因为我们现在要做的是这个通过咱们的余额不足的情况,然后来测试咱们的生命是15啊,大家看ad me,然后在这他的余额是不是50对吧?那下面呢,咱们就把咱们当前这个啊,咱们把咱们这个场景呢给模拟一下,然后咱们就按照咱们这标准的三层架构,有控制层,有业务层,然后有持久层。
09:35
把咱们整个完整的过程呢都给它写出来,然后咱们再去测试,咱们的声明是事物啊。
我来说两句