框架Spring-spring事务

概述

spring中的事务,通常是指servcice操作

事务API

*** 常用的三个接口
PlatformTransactionManager:平台事务管理器。
例如:
commit(TransactionStatus status) 提交事务
getTransaction(TransactionDefinition definition) 获取事务
rollback(TransactionStatus status) 回滚事务

TransactionDefinition:事务定义。
例如:
ISOLation_XXX:事务隔离级别.
PROPAGATION_XXX:事务的传播行为.(不是JDBC中有的,为了解决实际开发问题.)
TIMEOUT_DEFAULT: 默认值是-1,表示没有超时限制。如果有,以秒为单位进行设置。
注意:isReadOnly()获取事务是否只读
通常读写型事务:增加、删除、修改开启事务。只读型事务:执行查询时
sactionStatus:事务状态
例如:
是否有保存点
是否一个新的事务
事务是否已经提交
*** API接口关系
PlatformTransactionManager通过TransactionDefinition设置事务相关信息来管理事务,管理事务过程中,产生一些事务状态:状态由TransactionStatus记录.

事务处理

事务处理方式
Spring的事务管理分成两类:

  • 编程式事务管理:(了解)
    通过TransactionTemplate手动管理事务.
  • 声明式事务管理:(掌握)
    Spring的声明式事务是通过AOP实现的

事务的传播行为:(不是JDBC事务管理,用来解决实际开发的问题.)
传播行为作用:解决业务层之间互相调用事务的关系.

PROPAGATION_REQUIRED :支持当前事务,如果不存在,就新建一个

  • A,B 如果A有事务,B使用A的事务,如果A没有事务,B就开启一个新的事务.(即A,B是在一个事务中。)

PROPAGATION_SUPPORTS :支持当前事务,如果不存在,就不使用事务

  • A,B 如果A有事务,B使用A的事务,如果A没有事务,B就不使用事务.(这时也就是A,B都不使用事务管理了)

PROPAGATION_MANDATORY :支持当前事务,如果不存在,抛出异常

  • A,B 如果A有事务,B使用A的事务,如果A没有事务,抛出异常.

PROPAGATION_REQUIRES_NEW :如果有事务存在,挂起当前事务,创建一个新的事务

  • A,B 如果A有事务,B将A的事务挂起,重新创建一个新的事务.(即A,B不在一个事务中. A,B分别使用自己的事务,他们两个的事务互不影响.)

PROPAGATION_NOT_SUPPORTED :以非事务方式运行,如果有事务存在,挂起当前事务

  • A,B 非事务的方式运行,A有事务,就会挂起当前的事务.

PROPAGATION_NEVER :以非事务方式运行,如果有事务存在,抛出异常

PROPAGATION_NESTED :如果当前事务存在,则嵌套事务执行

  • 基于SavePoint技术.
  • A,B A有事务,A执行之后,将A事务执行之后的内容保存到SavePoint.B事务有异常的话,用户需要自己设置A事务是提交还是回滚.
    如果当前没有事务,则执行 REQUIRED 类似的操作。

声明式事务管理:(基于切面:掌握)

第一步:导入相应jar包.
   <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.0.2.RELEASE</version>
   </dependency>
   <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.7</version>
  </dependency>
第二步:引入相应约束: * aop、tx约束.

第三步:注册事务管理器; 
	<!-- 事务管理器 -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>
	</bean>

第四步:定义增强(事务管理)
<!-- 定义一个增强 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<!-- 增强(事务)的属性的配置 -->
		<tx:attributes>
			<!-- 
				isolation:DEFAULT	:事务的隔离级别.
				propagation			:事务的传播行为.
				read-only			:false.不是只读
				timeout				:-1
				no-rollback-for		:发生哪些异常不回滚
				rollback-for		:发生哪些异常回滚事务
			 -->
			<tx:method name="transfer"/>
		</tx:attributes>
	</tx:advice>

第五步:定义aop的配置(切点和通知的组合)
	<!-- aop配置定义切面和切点的信息 -->
	<aop:config>
		<!-- 定义切点:哪些类的哪些方法应用增强 -->
		<aop:pointcut expression="execution(* test4.AccountService.*(..))" id="mypointcut"/>
		<!-- 定义切面: -->
		<aop:advisor advice-ref="txAdvice" pointcut-ref="mypointcut"/>
	</aop:config>

基于注解事务管理

1步:<!--开启事务注解支持-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

2步:@Transactional(propagation = Propagation.REQUIRED,readOnly=false)

备注:纯注解
@Configuration
@EnableTransactionManagement
public class SpringTxConfiguration {
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值