概述
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 {
}