Spring事务
事务作用:
在数据层保障一系列的数据库操作同成功同失败 Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败
案例:银行账户转账
模拟银行账户间转账业务
需求:实现任意两个账户间转账操作
需求微缩:A账户减钱, B账户加钱
分析:
- 数据层提供基础操作,指定账户减钱(outMoney),指定账户价钱(inMoney)
- 业务层提供转账操作(transfer),调用减钱与加钱的操作
- 提供2个帐号和操作金额执行转账操作
- 基于Spring整合MyBatis环境搭建上述操作
结果分析:
- 程序正常执行,账户金额 A减B加 , 没有问题
- 程序执行失败,账户金额 A减B不变,出现问题
改进:
需要添加事务。 标准写法:在服务层接口中需要开启事务的方法上加@Transactional(降低耦合)
public interface AccountService{
/**
*转账操作
* @param out 传出方
* @param in 传入方
* @param money 金额
*/
@Transactional //1.开启事务
public void transfer(String out, String in, Double money)
}
在jdbcConfig中配置一个事务管理器,并将事务管理器交给Spring管理
// jdbcConfig
// 2. 配置事务管理器 也是一个接口 使之成为一个Bean对象
// PlatformTransactionManager 是Spring提供的一个标准接口
// DataSourceTransactionManager 是jdbc的事务,如果想换事务,换的就是这个。
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource){
DataSourceTransactionManager [对象名] = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);//使用外部注入的形式,从参数中接受数据
return [对象名];
}
然后到Spring的配置文件中,开启注解式事务驱动
//3. 开启注解式事务
@EnableTransactionManagement
然后在服务层impl中添加一个异常测试方法
@Service
public class AccountServiceImpl implements AccountService{
@Autowired
private AccountDao accountDao;
public void transfer(String out, String in, String money){
accountDao.outMoney(out,money);
int i = 1/0; //异常发生点
accountDao.inMoney(in,money);
}
}
因为开启了事务,数据库中的数据不会发生变动。