spring事务入门案例-银行账户转账
spring事务入门案例-银行账户转账
- 需求:实现任意两个账户间转账操作
- 需求微缩:A账户减钱,B账户加钱(实际开发中是三个账户)
- 分析:
- 数据层提供基础操作,指定账户减钱(outMoney),指定账户加钱(inMoney)
- 业务层提供转账操作(transfer),调用减钱与加钱的操作
- 提供2个账号和操作金额执行转账操作
- 基于Spring整合MyBatis环境搭建上述操作
- 结果分析:
- 程序正常执行时,账户金额A减B加,没有问题
- 程序出现异常后,转账失败,但是异常之前操作成功,异常之后操作失败,整体业务失败。
-
在业务层接口上添加Spring事务管理
public interface AccountService { /** * 转账操作 * @param out 转出方 * @param in 转入方 * @param money 金额 */ @Transactional // 开启事务 public void transfer(String out, String in, Double money); }
注意事项:Spring注解式事务通常添加到业务层接口中而不会添加到业务层实现类中,降低耦合。注解式事务可以添加到业务方法上表示当前方法开启事务,也可以添加到接口上表示当前接口所有方法开启事务。
-
设置事务管理器
// JdbcConfig.java 配置类中 @Bean // 指定开启的具体事务 public PlatformTransactionManager transactionManage(DataSource dataSource){ DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(); transactionManager.setDataSource(dataSource); return transactionManager; }
注意事项:事务管理器要根据实现技术进行选择,MyBatis框架使用的是JDBC事务。
-
开启注解式事务驱动
@Configuration @ComponentScan("com.charley") @PropertySource("classpath:jdbc.properties") @Import({JdbcConfig.class, MyBatisConfig.class}) @EnableTransactionManagement // 告诉spring开启了事务 public class SpringConfig { }