声明式事务 目录

文章目录

  • 声明式事务 目录
  • 32-环境搭建-声明式事务-目标
  • 33-环境搭建-声明式事务-思路
  • 34-环境搭建-声明式事务-代码
  • 35-环境搭建-声明式事务-实际测试运行
  • 36-环境搭建-声明式事务-注意
  • 37-表述层-各个配置文件的关系(下一篇)

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

什么是声明式事务,

不管是编程式事务还是声明式事务

归根到底都是事务

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


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


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


简单来说,声明式事务就是把编程式事务的一切,都交给spring来做

我们要学的就是怎么交给sprig来做,这也就是我们的目标

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

在平时,我们声明事务一般都是围绕着 Service 方法

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


这种方式比较简单,但是注意前提是需要配置一下事务管理器,以及需要修改一下配置文件,具体操作后面会详细说明

除了这种声明式事务,其实还有一种,叫做切入点表达式

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

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

下面看具体操作:

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


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


我们要求每个配置文件不要太长,而且每个配置文件就是专门完成一个任务(单一职责原则)

这样会比较好

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


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


下一步就是配置自动扫描的包

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


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


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

<?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>

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

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

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


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


需要注意的是 我们配置的扫描包,只配置了service,所以,事务只在这个包下有效,,下面我们来实际测试一下

先建一个接口再建一个实现类

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


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


然后去写它的实现类

注意@service注解是写在实现类里面的,不是写在接口里面的

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


然后实现一下

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


实测是ctrl+1

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

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


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


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


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

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


编程是一个很严谨的事情,错一丁点都不行的

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

因为日志不全,所以我们改成debug级别的

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


这下就有完整的sql了,并且有事务的体现,如果你英语比较好的华,在sql语句的前后,必然有事务的体现

必然改成手动提交之类的相关英文字眼

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


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


注意一下这个异常是要放在哪,才会触发回滚

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


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

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


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


这就说明我们这个配置是没有问题了,我们这个环境是有事务的了

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

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


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


自己可以测试验证一下

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


声明式事务配置好之后,我们的持久化层基本上就OK了

下面就是表述层了

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