目录
一:基本概念
搭建测试环境
基于xml声明式事务控制
二:事务相关配置 编辑
基于注解声明式事务控制
三:Spring事务角色
四:事务传播行为
五:案例:转账业务追加日志
一:基本概念
事务是开发中必不可少的东西, 使用JDBC开发时, 我们使用connnection对事务进行控制, 使用MyBatis时, 我们使用SqlSession对事务进行控制, 缺点显而易见, 当我们切换数据库访问技术时, 事务控制的方式总会变化,
事务作用:在数据层保障一系列的数据库操作同时成功,同时失败
Spring事务作用:在数据层或业务层保障一系列的数据库操作同时成功,同时失败
如何使用呢?
答:Spring提供了一个接口:
Spring就将这些技术基础上, 提供了统一的控制事务的接口。Spring的事务分为:编程式事务控制和声明式事务控制
事务控制方式 | 解释 |
---|---|
编程式事务控制 | Spring提供了事务控制的类和方法, 使用编码的方式对业务代码进行事务控制, 事务控制代码和业务 操作代码耦合到了一起,开发中不使用 |
声明式事务控制 | Spring将事务控制的代码封装, 对外提供了Xml和注解配置方式, 通过配置的方式完成事务的控制, 可以达到事务控制与业务操作代码解耦合,开发中推荐使用 |
Spring事务编程相关的类主要有如下三个
事务控制相关类 | 解释 |
---|---|
平台事务管理器 Platform TransactionManager | 是一个接口标准,实现类都具备事务提交、回滚和获得事务对象的功能,不同持久层框架可能会有不同实现方案 |
事务定义 TransactionDefinition | 封装事务的隔离级别、传播行为、过期时间等属性信息 |
事务状态 TransactionStatus | 存储当前事务的状态信息,如果事务是否提交、是否回滚、是否有回滚点等 |
虽然编程式事务控制我们不学习,但是编程式事务控制对应的这些类我们需要了解一下,因为我们在通过配置的方式进行声明式事务控制时也会看到这些类的影子
-
搭建测试环境
搭建一个转账的环境, dao层一个转出钱的方法, 一个转入钱的方法, service层一个转账业务方法,内部分别调用dao层转出钱和转入钱的方法, 准备工作如下:
-
数据库准备一个账户表tb account;
-
dao层准备一个AccountMapper, 包括incrMoney和decrMoney两个方法;
-
service层准备一个transferMoney方法, 分别调用incrMoney和decrMoney方法;
-
在applicationContext文件中进行Bean的管理配置;
-
测试正常转账与异常转账。
1.搭建基本环境
2.dao层准备一个AccountMapper, 包括incrMoney和decrMoney两个方法
package com.tangyuan.mapper;
public interface AccountMapper{
//+钱
@Update("update tb_account set money=money+#{money} where account_name=#{accountName}")
public void incrMoney(@Param("accountName") String accountName,@Param("money") Integer money) ;
//-钱
@Update("update tb_account set money=money-#{money} where account_name=#{accountName}")
public void decrMoney(@Param("accountName") String accountName,@Param("money") Integer money) ;
}
3,在业务层接口上添加Spring事务管理
public interface AccountService{
@Transactional
void transferMoney(String outAccount, String inAccount, Integermoney) ;
}
@Service("accountService")
public class AccountServiceImpl implements AccountService{
@Autowired
private AccountMapper accountMapper;
@Override
public void transferMoney(String outAccount, String inAccount, Integer money){
accountMapper.decrMoney(outAccount, money) ;
//int i=1/0;
accountMapper.incrMoney(inAccount, money) ;
}
}
<!--组件扫描-->
<context:component-scan base-package="com.tangyuan"/>
<!--加载properties文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--配置数据源信息-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="S{jdbc.driver} "></property>
<property name="url" value="S{jdbc.url} "></property>
<property name="username" value="S{jdbc.username} "></property>
<property name="password" value="S{jdbc.password} "></property>
</bean>
<!--配置SqlSessionFactoryBean, 作用将sqlSessionFactory存储到spring容器-->
<bean class="org.mybatis.spring.SqlsessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--MapperScannerConfigurer,作用扫描指定的包,产生Mapper对象存储到Spring容器-->
<bean class-"org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.tangyuan.mapper"></property>
</bean>
方式二:
-
基于xml声明式事务控制
结合上面我们学习的AOP的技术, 很容易就可以想到, 可以使用AOP对Service的方法进行事务的增强。
-
目标类:自定义的AccountServicelmpl,内部的方法是切点
-
通知类:Spring提供的,通知方法已经定义好,只需要配置即可
我们分析:
-
通知类是Spring提供的,需要导入Spring事务的相关的坐标;
-
配置目标类AccountServicelmpl;
-
使用advisor标签配置切面。
-
<!--配置平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource"ref="dataSource"/>
</bean>
<!--配置Spring提供好的Advice-->
<!--命名空间需要设置-->
<tx:adviceid="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/>
<!--
配置不同的方法的事务属性
name :方法名称 * 代表通配符 添加操作addUser、addAccount、addOrders=>add*
isolation:事务的隔离级别,解决事务并发问题
timeout:超时时间 默认-1 单位:秒
read-only:是否只读,查询操作设置为只读
propagation:事务的传播行为,解决业务方法调用业务方法(事务嵌套问题)
-->
</tx:attributes>
</tx:advice>
<!--事务增强的aop-->
<aop:config>
<!--配置切点表达式-->
<aop:pointcutid="txPointcut" expression="execution(*com.tangyuan.service.impl.*.*(..))"/>
<!--配置织入关系通知advice-ref引入Spring提供好的-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>
二:事务相关配置
-
基于注解声明式事务控制
三:Spring事务角色
事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法
事务协调员:加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法
四:事务传播行为