1.Spring事务

Spring事务

事务作用:

​ 在数据层保障一系列的数据库操作同成功同失败 ​ Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败

案例:银行账户转账

​ 模拟银行账户间转账业务

需求:实现任意两个账户间转账操作

需求微缩:A账户减钱, B账户加钱

分析:

  1. ​ 数据层提供基础操作,指定账户减钱(outMoney),指定账户价钱(inMoney)
  2. ​ 业务层提供转账操作(transfer),调用减钱与加钱的操作
  3. ​ 提供2个帐号和操作金额执行转账操作
  4. ​ 基于Spring整合MyBatis环境搭建上述操作

结果分析:

  1. 程序正常执行,账户金额 A减B加 , 没有问题
  2. 程序执行失败,账户金额 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);
    }
}

​ 因为开启了事务,数据库中的数据不会发生变动。

上一篇
下一篇