项目一众筹网01_03环境搭建_声明式事务

声明式事务 目录

32-环境搭建-声明式事务-目标

什么是声明式事务,
不管是编程式事务还是声明式事务
归根到底都是事务
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
简单来说,声明式事务就是把编程式事务的一切,都交给spring来做
我们要学的就是怎么交给sprig来做,这也就是我们的目标

33-环境搭建-声明式事务-思路

在平时,我们声明事务一般都是围绕着 Service 方法
在这里插入图片描述
这种方式比较简单,但是注意前提是需要配置一下事务管理器,以及需要修改一下配置文件,具体操作后面会详细说明
除了这种声明式事务,其实还有一种,叫做切入点表达式

在这里插入图片描述

34-环境搭建-声明式事务-代码

下面看具体操作:
在这里插入图片描述
在这里插入图片描述
我们要求每个配置文件不要太长,而且每个配置文件就是专门完成一个任务(单一职责原则)
这样会比较好
在这里插入图片描述
在这里插入图片描述
下一步就是配置自动扫描的包

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">

	<!-- 配置自动扫描的包:主要是为了把Service扫描到IOC容器中 -->
	<context:component-scan base-package="com.atguigu.crowd.service"/>
	
	<!-- 配置事务管理器 -->
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<!-- 装配数据源 -->
		<property name="dataSource" ref="dataSource"/>
		
	</bean>
	
	<!-- 配置事务切面 -->
	<aop:config>
		<!-- 考虑到后面我们整合SpringSecurity,避免把UserDetailsService加入事务控制,让切入点表达式定位到ServiceImpl -->
		<aop:pointcut expression="execution(* *..*ServiceImpl.*(..))" id="txPointcut"/>
		
		<!-- 将切入点表达式和事务通知关联起来 -->
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
	</aop:config>
	
	<!-- 配置事务通知 -->
	<tx:advice id="txAdvice" transaction-manager="txManager">
	
		<!-- 配置事务属性 -->
		<tx:attributes>
			
			<!-- 查询方法:配置只读属性,让数据库知道这是一个查询操作,能够进行一定优化 -->
			<tx:method name="get*" read-only="true"/>
			<tx:method name="find*" read-only="true"/>
			<tx:method name="query*" read-only="true"/>
			<tx:method name="count*" read-only="true"/>
			
			<!-- 增删改方法:配置事务传播行为、回滚异常 -->
			<!-- 
				propagation属性:
					REQUIRED:默认值,表示当前方法必须工作在事务中,如果当前线程上没有已经开启的事务,则自己开新事务。如果已经有了,那么就使用这个已有的事务。
						顾虑:用别人的事务有可能“被”回滚。
					REQUIRES_NEW:建议使用的值,表示不管当前线程上有没有事务,都要自己开事务,在自己的事务中运行。
						好处:不会受到其他事务回滚的影响。
			 -->
			<!-- 
				rollback-for属性:配置事务方法针对什么样的异常回滚
					默认:运行时异常回滚
					建议:编译时异常和运行时异常都回滚
			 -->
			<tx:method name="save*" propagation="REQUIRES_NEW" rollback-for="java.lang.Exception"/>
			<tx:method name="update*" propagation="REQUIRES_NEW" rollback-for="java.lang.Exception"/>
			<tx:method name="remove*" propagation="REQUIRES_NEW" rollback-for="java.lang.Exception"/>
			<tx:method name="batch*" propagation="REQUIRES_NEW" rollback-for="java.lang.Exception"/>
			
		</tx:attributes>
	
	</tx:advice>

</beans>

在这里插入图片描述

35-环境搭建-声明式事务-实际测试运行

在这里插入图片描述
在这里插入图片描述
先建一个接口再建一个实现类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后实现一下

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
编程是一个很严谨的事情,错一丁点都不行的
在这里插入图片描述

因为日志不全,所以我们改成debug级别的
在这里插入图片描述
这下就有完整的sql了,并且有事务的体现,如果你英语比较好的华,在sql语句的前后,必然有事务的体现
必然改成手动提交之类的相关英文字眼
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这就说明我们这个配置是没有问题了,我们这个环境是有事务的了

36-环境搭建-声明式事务-注意

在这里插入图片描述
在这里插入图片描述
自己可以测试验证一下
在这里插入图片描述
声明式事务配置好之后,我们的持久化层基本上就OK了
下面就是表述层了

37-表述层-各个配置文件的关系(下一篇)

Guess you like

Origin blog.csdn.net/qq_41753340/article/details/121358375