spring系列 事务
Spring事务作用
在数据层或业务层加一层保障,使得一系列对数据库的操作同成功同失败。
用法:
在业务层接口上添加Spring事务管理注解@Transactional
public interface AccountService {
@Transactional
public void transfer(String out,String in ,Double money);
}
一般不会添加到业务层实现类中,降低耦合。
除了添加到方法上,还可以添加到接口上表示当前接口所有方法开启事务。
开启注解式事务驱动
@Configuration @ComponentScan("com.itheima") @PropertySource("classpath:jdbc.properties") @Import({JdbcConfig.class,MybatisConfig.class})
@EnableTransactionManagement
public class SpringConfig {
}
注入事务管理器
这一步可以写到Config类中
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource){
DataSourceTransactionManager ptm = new DataSourceTransactionManager();
ptm.setDataSource(dataSource);
return ptm;
}
spring的设计
原本的操作数据库的方法,每一个自己都会单独开启一个事务,失败会回滚自己的部分,但spring逻辑上使得所有操作都在一个事务里,同成功同失败。
spring发起事务的方法叫做事务管理员,加入进来的方法都叫事务协调员(可以是数据层还可以是业务层,都算,只是个逻辑角色)
@Transactional的属性
readOnly 设置是否为只读事务 readOnly=true 只读事务
timeout 设置事务超时时间 timeout = -1(永不超时)
rollbackFor 设置事务回滚异常(class) rollbackFor = {NullPointException.class}
rollbackForClassName 设置事务回滚异常(String) 同上格式为字符串
noRollbackFor 设置事务不回滚异常(class) noRollbackFor = {NullPointException.class}
noRollbackForClassName 设置事务不回滚异常(String) 同上格式为字符串
propagation 设置事务传播行为 ……
使用场景如:
spring默认只回滚error和运行时异常,当出现其他异常如:IO异常,这种时候要将其配置到注解属性中,才会回滚。如:@Transactional(rollbackFor = IOException.class)
事务传播行为:
REQUIRED(默认) 开启T 加入T
无 新建T2
REQUIRES_NEW 开启T 新建一个T
无 新建T2
SUPPORTS 开启T 加入T
无 无
NOT_SUPPORTED 开启T 无
无 无
MANDATORY 开启T 加入T
无 ERROR
NEVER 开启T ERROR
无 无
NESTED 设置savePoint,一旦事务回滚,事务将回滚到savePoint处,交由客户响应提交/回滚
需求是不管代码出不出问题,我们的日志必须记录,考虑用finally,如果日志业务如果只加@Transactional的话,会和具体的业务逻辑纳入到统一事务中,必须用REQUIRES_NEW,使得执行时会新开一个自己的事务。
@Service
public class LogServiceImpl implements LogService {
@Autowired
private LogDao logDao;
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void log(String out,String in,Double money ) {
logDao.log("转账操作由"+out+"到"+in+",金额:"+money);
}
}
public void transfer(String out,String in ,Double money) {
try{
accountDao.outMoney(out,money);
accountDao.inMoney(in,money);
}finally {
logService.log(out,in,money);
}
}