Spring之事务编程概述
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
一基本概念
事务是开发中必不可少的东西 使用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)
}
}
<!--组件扫描-->
<contextcomponent-scan base-package="com.tangyuan"/>
<!--加载properties文件-->
<contextproperty-placeholder location="classpathjdbc.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-->
<!--命名空间需要设置-->
<txadviceid="txAdvice" transaction-manager="transactionManager">
<txattributes>
<txmethod name="*"/>
<!--
配置不同的方法的事务属性
name 方法名称 * 代表通配符 添加操作addUser、addAccount、addOrders=>add*
isolation事务的隔离级别解决事务并发问题
timeout:超时时间 默认-1 单位:秒
read-only:是否只读,查询操作设置为只读
propagation:事务的传播行为,解决业务方法调用业务方法(事务嵌套问题)
-->
</txattributes>
</txadvice>
<!--事务增强的aop-->
<aopconfig>
<!--配置切点表达式-->
<aoppointcutid="txPointcut" expression="execution(*com.tangyuan.service.impl.*.*(..))"/>
<!--配置织入关系通知advice-ref引入Spring提供好的-->
<aopadvisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aopconfig>
二事务相关配置
-
基于注解声明式事务控制
三Spring事务角色
事务管理员发起事务方在Spring中通常指代业务层开启事务的方法
事务协调员加入事务方在Spring中通常指代数据层方法也可以是业务层方法
四事务传播行为