@Tranasctional注解是Spring 框架提供的声明式注解事务解决方案,我们在开发中使用事务保证方法对数据库操作的原子性,要么全部成功,要么全部失败,在使用@Transactional注解时需要注意以下问题:
1.@Transactional 注解只能用在public 方法上,如果用在protected或者private的方法上,不会报错,但是该注解不会生效。
2. @Transactional注解只能回滚非检查型异常,具体为RuntimeException及其子类和Error子类,可以从Spring源码的DefaultTransactionAttribute类里找到判断方法rollbackOn。
@Override
public boolean rollbackOn(Throwable ex) {
return (ex instanceof RuntimeException || ex instanceof Error);
}
- 使用rollbackFor 属性来定义回滚的异常类型,使用 propagation 属性定义事务的传播行为。
- @Transactional注解不能回滚被try{}catch() 捕获的异常。
默认回滚RuntimeException和Error,如果要回滚其他异常要记得配置rollbackFor
//Spring事务管理
@Transactional(rollbackFor = Exception.class)
@Override
public void deleteById(Integer id) {
try{
deptMapper.deleteById(id);
int a=1/0;
empMapper.deleteById(id);
}finally {
//另一个事务
insert();
}
}
事务传播行为主要有两种,REQUIRED(默认)和REQUIRED_NEW;
REQUIRED行为是加入事务操作,比如deleteById开启了一个事务但是遇到异常,遇到另一个事务insert会加入到当前事务,所以程序中只有一个事务,会同时回滚。
REQUIRED_NEW遇到insert事务会开启一个新的事务,可以避免同时回滚。
//Spring事务管理
@Transactional
@Override
public void deleteById(Integer id) {
try{
deptMapper.deleteById(id);
int a=1/0;
empMapper.deleteById(id);
}finally {
//另一个事务
insert();
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void insert(){
;;
}