1、Spring事务简介:
简历:银行转账功能,一用户转账,另一个用户接收,而他们在转账或接收的过程中,若有一方出现报错,则将全部事务回滚,要么同时成功,要么同时失败!
模拟案例:
当调用该方法时:
转账的人顺利转账了,个人金额已经减少,但是由于出现公示int i=1/0;出错,导致程序运行中断,入账的人的方法没有运行到,导致接收不了数据,从而出现转账和入账没有达到同步,接下来我们用Spring事务进行解决处理。
Spring事务三步骤:
(1)在业务层接口上添加Spring事务管理:
(2)设置事务管理器:
在jdbcConfig类中:
添加@Bean
PlatformTransactionManager transactionManager(DataSource dataSource){}
// 设置事务管理器 (MyBatis框架使用的是jdbc事务)
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource){
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
(3)开启注解式事务驱动:
即可完成Spring事务。
对于上图中那些jdbcConfig类、和SpringConfig类,是关于Spring整合MyBatis所创建的类,在我个个人首页的其他笔记中有详细介绍,这里就不过多介绍了。
2、Spring事务属性:
(1)rollbackFor属性:
由于有一些报错是不会自动回滚的,比如:IOException异常等,这个时候需要我们自己设置回滚
解决方法:
在该调用方法中的事务管理@Transactional()中添加rollbackFor = (IOException.class),则当该方法遇到IOException异常就会进行回滚。
从而保证事务同步成功和失败!
3、事务传播行为:
即使转帐失败,事务发生回滚,但是也会有日志转帐记录。
在@Transactional()中添加propagation = Propagation.REQUIRES_NEW,表示该事务为新事务,不与其他事务合并,当其他事务回滚时,而该事务继续进行。
最终效果:当进行转账和入账时,中途出现报错导致两事务回滚,而日志记录事务依然可以继续进行。