Java日记之SSM 事务处理(事务的传播行为篇)


前言

在重建了无数次项目之后 ,终于把实验做出来了

提示:以下是本篇文章正文内容,下面案例可供参考

一、传播行为是什么?

传播行为可以分解为事务的传播+事务的行为 ,这里主要讨论有多个事务嵌套时,方法之间是否要共用一个事务

具体关于事务是什么的问题就先不讲了

二、REQUIRES_NEW & REQUIRED

1.区别

其中,REQUIRES_NEW是表示当前事务总是开启一个新事务 , 而后者表示两个方法共用一个事务

最重要的一点 : REQUIRES_NEW标记的方法 ,如果当前方法已有事务,会将当前的事务先挂起 ,类似于队列 [* 下文会用到它]

2.实验示例

代码如下(示例):

方法嵌套的层次结构:
	MulService(){
		updateById();
		updatePriceById();	
	}

数据库关键字段初始值 : sp_name : 1.20 ; sp_kucun : 99

在这里插入图片描述

(1).都使用REQUIRED且其一存在运行时异常

@Transactional(propagation = Propagation.REQUIRED)
	public void updateById() {
		goodMapper.updateById("001", 111);
		int i = 10 / 0 ;
	}
	
	@Transactional(propagation = Propagation.REQUIRED)
	public void updatePriceById() {
		goodMapper.updatePriceById("001", 1.3f);
	}
	@Transactional
	public void testTx() {
		System.out.println("/**********/");
		goodService.updateById();
		
		System.out.println("/**********/");
		goodService.updatePriceById();
		

	}

运行报错 , 且事务整体回滚(即数据未修改)
在这里插入图片描述
在这里插入图片描述
(2)方法其一使用REQUIRES_NEW

	@Transactional(propagation = Propagation.REQUIRES_NEW)
	public void updateById() {
		goodMapper.updateById("001", 111);
	}
	
	@Transactional(propagation = Propagation.REQUIRED)
	public void updatePriceById() {
		goodMapper.updatePriceById("001", 1.3f);
		int i = 10 / 0 ;
	}

由于updateById()使用的是新事务,所以方法操作成功,下面的方法操作失败
在这里插入图片描述
注意 : 大事务中设置的属性是会覆盖小事务的


三、基于配置的事务处理

与AOP一样 ,事务处理也是遵循重要的写在配置,次要的打上注解的原则的
当然,当方法数量巨大的时候,也可以使用配置方式开启注解
需要先配切面,且原先的@Transactional注解都要删掉

	<!-- spring 事务管理 -->
	 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	 	<property name="dataSource" ref="dataSource"></property>
	 </bean>
	
	<aop:config>
	 	<aop:pointcut expression="execution(* edu.cust.cs.*.*.*(..))" id="txPointCut"/>
	 	<aop:advisor advice-ref="myTx" pointcut-ref="txPointCut"/>
	 </aop:config>
	 
	 <tx:advice id="myTx" transaction-manager="transactionManager">
	 	<tx:attributes>
	 		<!-- 需要使用事务的方法 -->
	 		<tx:method name="select*" read-only="true"/>
	 		<tx:method name="updatePriceById"
	 		propagation="REQUIRED"/>
	 		<tx:method name="updateById"
	 		propagation="REQUIRES_NEW"/>
	 	</tx:attributes>
	 </tx:advice>

在这里插入图片描述

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页