等一下,我们进行事务的提交等操作,一般不就是用在业务层(service层)。
假如我们一个转账操作,(封装成一个方法),设计一个账户的增加,一个账户的减少。
当我们执行一个操作出现 异常,但是上个增加语句已经执行了因此,但是一下语句因为报错没执行,就出现偏差了。
无非这不是就是,当我们trt检测出现异常时进行事务roollback,成功时提交。
SpringConfig.java
//开启注解式事务驱动
@EnableTransactionManagement
JdbcConfig.java
//配置事务管理器,mybatis使用的是jdbc事务
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
DataSourceTransactionManager manager = new DataSourceTransactionManager();
manager.setDataSource(dataSource);
return manager;
}
Service.Java
//配置当前接口方法具有事务,
// 就是这整个方法就算一个事务,只要他不出错,就能自动提交事务。里面语句正常执行。
@Transactional
public void transfer(String out,String in ,Double money) ;
事务角色
事务管理员:我的一个方法包含多个事务语句,如增删,因为增和删分别本身是各自一条是语句。
那我们这个方法就是事务管理员。
事务协调员:上面的增删语句个是事务协调员。
当我们,为业务层的某个接口方法 + @@Transactional时,这个方法就属于一个事务了。
@Transactional(rollbackFor = {IOException.class})
看的出设置....异常,几乎都是一样的,就是值的个是不同,另外插一句,我们Spring事务,并不是对任何异常都进行回滚,如IOEXcetion异常他就不回滚,那么我们就要添加到里面。
事务传播行为![](https://i-blog.csdnimg.cn/blog_migrate/dcee1a72a285951d90f4bae2334e4093.png)
因为日志方法这是事务,在加减事务中就相当于事务协调员。
假如说: 当我们,上述转账操作,新加一个logService操作,当我们转账操作出现异常时,他肯定会不报错,转账不成功,但是我们的转账日志也记录不了,那么我们也想在转账出错时,让日志也记录,那么应该怎么做。
@Transactional(propagation = Propagation.REQUIRES_NEW)
// 开启一个新事务,他不作为事务协调员加入事务管理员中。
public void transfer(String out, String in, Double money);
假如@Transactional上层方法也有@Transactional,那么就是相当一个事务管理员和事务协调员。
看的出这个是相对的,新建 就是相当于把方法开启事务,加入就是作为一个事务协调员加入事务管理员,等一下,这个是相对的。