Spring Boot定时任务quartz发生异常时数据库的回滚

无法回滚的代码

如下伪代码,在两条数据库插入操作之间抛出了异常,本来以为添加了@Transactional(rollbackFor = Exception.class)注解发生异常后会回滚,但是事与愿违,结果是发生异常后没回滚,第一条数据插入成功了

@Service
@Transactional(rollbackFor = Exception.class)
public class TestJobBean extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) {
        dbService.insert("野猿新一");
        int i = Integer.parseInt("我不是int啦"); // 此处会抛出NumberFormatException异常
        dbService.insert("野猿新二");
    }
}

可以回滚的代码

将业务相关的数据库操作代码抽出到独立的Service中,然后在该Service上添加@Transactional(rollbackFor = Exception.class)注解,如下代码所示

@Service
@Transactional(rollbackFor = Exception.class)
public class DBService {
    protected void doSomething() {
        dbService.insert("野猿新一");
        int i = Integer.parseInt("我不是int啦"); // 此处会抛出NumberFormatException异常
        dbService.insert("野猿新二");
    }
}
@Service
public class TestJobBean extends QuartzJobBean {

    @Resource
    DBService dbService;

    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) {
        dbService.doSomething();
    }
}

这样就OK了,发生异常后就可以成功,至于为啥要这样写我也不清楚,有清楚的老铁可以留言评论下

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值