Spring的事务管理
Spring事务管理API
1、Spring事务管理的两种方式
第一种:编程式事务管理(不用)
第二种:声明式事物管理
(1)基于 xml 配置文件实现
(2)基于注解实现
2、Spring事务管理的 API 介绍
@2.1Spring事务管理主要包括3个接口(位于org.springframework.transaction包中):
(1)PlatformTransactionManager ——事务管理器
(2)TransactionDefinition——事务定义信息(隔离、传播、超时、只读)
(3)TransactionStatus——事务具体运行状态
@2.2Spring事务管理涉及的接口的联系如下:
@2.3Spring为不同的持久化框架提供了不同的 PlatformTransactionManager 接口实现:
PlatformTransactionManager实现类 |
说明 |
org.springframework.jdbc.datasource. DataSourceTransactionManager |
使用spring JDBC或mybatis进行持久化数据时使用 |
org.springframework.orm.hibernate5. HibernateTransactionManager |
使用Hibernate5版本进行持久化数据 |
org.springframework.orm.jpa.JpaTransactionManager |
Jpa时使用 |
org.springframework.orm.jdo.JdoTransactionManager |
Jdo时使用 |
org.springframework.transaction.jta. JtaTransactionManager |
使用JTA实现来管理事务,在一个事务跨越多个资源时必须使用 |
@2.4两种声明式事务 ,我们都需要先配置——事物管理器
搭建转账环境
1、创建数据库表,添加数据
2、创建 service 和 dao 类,完成注入关系
(1)service层又叫业务逻辑层
(2)dao层,单纯对数据库操作层,在 dao 层不添加业务(一般情况下)
(3)需求:小王转账1000给小马
小王少1000
小马多1000
dao层:
Service层:
3、产生问题
小王少了1000之后,出现异常,小马不会多1000,钱就丢失了
4、解决:
添加事物解决,出现异常进行回滚操作
声明式事务管理(使用AspectJ的xml配置)
配置文件方式使用 AOP 思想配置
第一步:配置事务管理器
<!-- 第一步:配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入dataSource,指定对哪个数据库进行操作 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
第二步:配置事物增强
<!-- 第二步:配置事务增强 -->
<tx:advice id="txadvice" transaction-manager="transactionManager">
<!-- 做事务的操作 -->
<tx:attributes>
<!-- 设置进行事务操作的方法匹配规则 -->
<tx:method name="account*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
第三步:配置切面
<!-- 第三步:配置切面 -->
<aop:config>
<!-- 切入点 -->
<aop:pointcut expression="execution(* com.bjxb.service.OrdersService.*(..))" id="pointcut1"/>
<!-- 切面(把增强用在哪个切入点上) -->
<aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1"/>
</aop:config>
声明式事务管理(注解)
第一步:配置事物管理器
<!-- 第一步:配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
第二步:配置事物注解
<!-- 第二步:开启事务的注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
第三步:在要使用事物的方法所在类上面添加注解 @Transactional
@Transactional
public class OrdersService {
}