【金秋打卡】第20天 Spring Boot打造企业微信点餐系统 3
第一模块:
课程名称: 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的源码:
解析:
getTransaction方法:获取事务,启动参数类型为TransactionDefinition,它是一种事务定义,在未来我们可以通过@Transactional配置它,其中隔离级别和传播行为是核心的内容;
commit方法:提交事务,这里有一个事务状态参数,因为一个事务中可能某些方法中存在异常,所以通过这个状态可以让当前事务感知这些情况的存在;
rollback方法:回滚事务,存在事务状态参数
Spring数据库流程约定:
所以,Spring事务拦截器的作用是:将事务管理器接口定义的三个方法织入到Spring事务拦截器的流程中去(实现技术是:动态代理)
解析:
获取事务(getTransaction)这步就可以设置一些我们配置的属性,比如隔离级别、异常类型;然后就可以执行业务方法了,而这些业务方法就是我们所编写的个性业务逻辑代码;执行业务方法的过程可能正常,也可能发生异常,如果发生异常且满足事务配置,则会走到回滚事务(rollback)这步;如果一切正常或者异常是事务配置允许的,则会提交事务(commit)。由于获取事务、回滚和提交这三步是Spring事务拦截器把事务管理器的方法织入到“Spring事务处理流程”,所以并不需要我们编写任何代码,而我们仅仅需要通过@Transactional告知Spring哪个类或者方法需要事务即可。@Transactional可以标注在类或者方法上,如果是类,则对所有public且非静态的方法有效;如果是方法,则只对方法有效。
补充:
动态代理:想要给实现了某个接口的类中的方法,加一些额外的处理逻辑,比如说加日志,加事务等;此时就可以给这个类创建一个代理,故名思议就是创建一个新的类,这个类不仅包含被代理类的所有方法的功能,而且还在原来的基础上添加了额外的处理逻辑,另外,这个代理类并不是事先定义好的,而是动态生成的,如此就具有解耦的意义,灵活,扩展性强的特点;动态代理的代理类不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的。
静态代理:代理类在程序运行前就已经存在,那么这种代理方式被成为静态代理
所以,基于反射实现的IOC和基于动态代理实现的AOP,他们的区别其实一句话就能总结出来:IOC中存在的是bean,而bean就是一个类的总代理,注意这个代理仅仅只是代理,没有对bean做什么逻辑增量,来增强这个bean;但是AOP的动态代理一般会对代理类做逻辑增量,来增强代理类能的功,这些功能一般都是些通用功能,比如:日志,事务,权限等通用的功能。
注解@Transactional源码:
解析:
value和transactionManager都是指定一个Bean Name(bean与其所代理的类在逻辑功能上完全一致,IOC做的只是接管一个类,并没有给这个类做逻辑增强 ),来确定你使用的是哪个事务管理器,默认值是“transactionManager”。对于超时时间(timeout)和只读事务(readOnly)相信也比较好理解。剩下的rollbackFor是指定在发生哪种异常下回滚事务;rollbackForClassName指定回滚事务的异常名称;noRollbackFor是指定在哪种异常下不回滚事务;noRollbackForClassName指定的是不回滚事务的异常名称。
注意:
Spring数据库事务流程是通过Spring AOP实现的,而Spring AOP则是通过动态代理技术实现的,在某些情况下@Transactional会失效!!!
第四模块:
学习截图:
共同学习,写下你的评论
评论加载中...
作者其他优质文章