Spring事务抛出Exception异常不回滚

今天有个业务逻辑流程为:

1.访客预约确认先更新预约状态为“预约确认”

2.调用http接口发短信、更新预约状态为“预约成功”等一系列操作

这里面有个问题,如果第2步调接口异常或返回失败。则第1步需要回滚。开始我的代码如下:

	public void updateStatusConfirm(int id) throws Exception {
		appointmentMapper.updateStatusConfirm(id);
		String res = Httper.get(appConfirmUrlPre + URL_SUFFIX + id);
		log.info("预约确认接口返回值为:" + res);
		if (StringUtils.isBlank(res) || !"0".equals(JSON.parseObject(res).getString("resultCode"))) {
			throw new Exception("预约确认接口返回失败,请稍后重试!");
		}
	}

结果发现第1步执行成功,而第2步返回失败,事务并没有回滚。

后来才发现,捕获了异常不会发生事务回滚,除非抛出RuntimeException异常,更改代码如下:

	public void updateStatusConfirm(int id) throws Exception {
		appointmentMapper.updateStatusConfirm(id);
		String res = Httper.get(appConfirmUrlPre + URL_SUFFIX + id);
		log.info("预约确认接口返回值为:" + res);
		if (StringUtils.isBlank(res) || !"0".equals(JSON.parseObject(res).getString("resultCode"))) {
			throw new RuntimeException("预约确认接口返回失败,请稍后重试!");
		}
	}

就可以了。

这也意味着在service层最好不要捕获异常,否则不会回滚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值