为了账号安全,请及时绑定邮箱和手机立即绑定
首页 手记 【金秋打卡】第20天 Spring...

【金秋打卡】第20天 Spring Boot打造企业微信点餐系统 3

2022.11.16 23:37 54浏览

第一模块:

课程名称: Spring Boot打造企业微信点餐系统

章节名称:5-1 ~ 5-4

讲师姓名:廖师兄


第二模块:

内容概述:

5-1 ~ 5-4小节主要讲解了商品的DAO、Service以及对应的API


第三模块:

学习心得:

13 数据库事务篇1:Spring事务管理器和事务约定

事务:要么不做,要么就做完;作用:保证数据在一个业务流程中的一致性这里存在一个矛盾:提高数据库一致性往往也会造成并发能力的下降,从而影响到网站的性能,尤其对于那些拥有大量用户的网站在抢购商品的时候,往往还需要考虑系统的性能,以提高用户体验。

Spring编程中事务有两种实现方式:编程式事务、声明式事务;

编程式事务就是程序员自己通过编码来实现事务这个功能,而声明式事务就是引用别人写好的事务逻辑,我们通过“一定”的方式拿来用,一样可以实现事务这个功能;

现在的主流开发都是使用声明式事务,来实现“数据库一致”。

Spring中声明式事务的核心是:事务管理器和注解@Transactional,通过这个注解就可以配置事务,这个注解可以使用在类或者方法上。

声明式事务的原理:首先需要配置事务管理器,这个Spring Boot会帮助我们完成,我们不用管,Spring Boot会自动装配“通用的增强模块”来减少我们的开发任务,让我们专注于个性化的业务逻辑!!!

Spring中存在多种事务管理器,不过它们都需要实现接口PlatformTransactionManager,但是这只是一个接口非实现类,这里因为依赖了MyBatis的starter包,这样Spring Boot就会装配DataSourceTransactionManager;

接口PlatformTransactionManager的源码:

https://img1.sycdn.imooc.com/637503120001758607310583.jpg


解析:

  • getTransaction方法:获取事务,启动参数类型为TransactionDefinition,它是一种事务定义,在未来我们可以通过@Transactional配置它,其中隔离级别和传播行为是核心的内容;

  • commit方法:提交事务,这里有一个事务状态参数,因为一个事务中可能某些方法中存在异常,所以通过这个状态可以让当前事务感知这些情况的存在;

  • rollback方法:回滚事务,存在事务状态参数

Spring数据库流程约定:

https://img1.sycdn.imooc.com/6375031f0001f90e07680393.jpg

所以,Spring事务拦截器的作用是:将事务管理器接口定义的三个方法织入到Spring事务拦截器的流程中去(实现技术是:动态代理)

解析:

获取事务(getTransaction)这步就可以设置一些我们配置的属性,比如隔离级别、异常类型;然后就可以执行业务方法了,而这些业务方法就是我们所编写的个性业务逻辑代码;执行业务方法的过程可能正常,也可能发生异常,如果发生异常且满足事务配置,则会走到回滚事务(rollback)这步;如果一切正常或者异常是事务配置允许的,则会提交事务(commit)。由于获取事务、回滚和提交这三步是Spring事务拦截器把事务管理器的方法织入到“Spring事务处理流程”,所以并不需要我们编写任何代码,而我们仅仅需要通过@Transactional告知Spring哪个类或者方法需要事务即可。@Transactional可以标注在类或者方法上,如果是类,则对所有public且非静态的方法有效;如果是方法,则只对方法有效。

补充:

动态代理:想要给实现了某个接口的类中的方法,加一些额外的处理逻辑,比如说加日志,加事务等;此时就可以给这个类创建一个代理,故名思议就是创建一个新的类,这个类不仅包含被代理类的所有方法的功能,而且还在原来的基础上添加了额外的处理逻辑,另外,这个代理类并不是事先定义好的,而是动态生成的,如此就具有解耦的意义,灵活,扩展性强的特点;动态代理的代理类不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的。

静态代理:代理类在程序运行前就已经存在,那么这种代理方式被成为静态代理

所以,基于反射实现的IOC和基于动态代理实现的AOP,他们的区别其实一句话就能总结出来:IOC中存在的是bean,而bean就是一个类的总代理,注意这个代理仅仅只是代理,没有对bean做什么逻辑增量,来增强这个bean;但是AOP的动态代理一般会对代理类做逻辑增量,来增强代理类能的功,这些功能一般都是些通用功能,比如:日志,事务,权限等通用的功能。

注解@Transactional源码:

https://img1.sycdn.imooc.com/6375032a0001dcbd06990689.jpg

https://img3.sycdn.imooc.com/6375033200019e5906410444.jpg


解析:

value和transactionManager都是指定一个Bean Name(bean与其所代理的类在逻辑功能上完全一致,IOC做的只是接管一个类,并没有给这个类做逻辑增强 ),来确定你使用的是哪个事务管理器,默认值是“transactionManager”。对于超时时间(timeout)和只读事务(readOnly)相信也比较好理解。剩下的rollbackFor是指定在发生哪种异常下回滚事务;rollbackForClassName指定回滚事务的异常名称;noRollbackFor是指定在哪种异常下不回滚事务;noRollbackForClassName指定的是不回滚事务的异常名称。

注意:

Spring数据库事务流程是通过Spring AOP实现的,而Spring AOP则是通过动态代理技术实现的,在某些情况下@Transactional会失效!!!


第四模块:

学习截图:

https://img2.sycdn.imooc.com/6375023e0001ac4307600223.jpg

点击查看更多内容
0人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
全栈工程师
手记
粉丝
3
获赞与收藏
1

关注TA,一起探索更多经验知识

同主题相似文章浏览排行榜

风间影月说签约讲师

51篇手记,涉及Java、MySQL、Redis、Spring等方向

进入讨论

Tony Bai 说签约讲师

151篇手记,涉及Go、C、Java、Python等方向

进入讨论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消