Spring 声明式事务(@Transactional)是保证数据一致性的核心手段,但使用不当会导致预期外的回滚行为。本文通过两个实战场景,深入讲解 Spring Boot 中事务的正确使用方式。第一部分:建议的数据库与外部服务操作顺序——先调用阿里云 API 创建 RAM 子账号(外部服务),确认成功后再将信息写入数据库,避免因子账号创建失败导致数据库中产生无效记录。第二部分:Controller 层捕获异常时的事务回滚问题——即使外层 try-catch 捕获了异常,被 @Transactional(rollbackFor = Exception.class) 注解的 Service 方法内部抛出异常后,事务依然会回滚;异常被捕获并不会阻止事务回滚,因为 Spring 事务管理器在方法抛出异常时即标记回滚。
本文适用于使用 Spring Boot 进行事务管理的开发者。
先调用阿里云服务创建RAM子账号:
再将RAM子账号的信息入库:
以下代码中,aliyunRamUserService.remove(args);被@Transcation(rollback=Exception.class)注解包裹,就算外层异常被捕获,事务也会回滚
java@PostMapping("remove")
public ResponseResultModel<Object> remove(@RequestBody AliyunRamUser.RemoveArgs args) {
try {
aliyunRamUserService.remove(args);
return responseSuccess("删除RAM子账户成功");
} catch (ServerException e) {
log.error("删除RAM子账户失败", e);
return responseFailure(ResponseCodeEnum.SERVER_OPERATE_ERROR, e.getMessage());
} catch (Exception e) {
log.error("删除RAM子账户失败", e);
return responseFailure(ResponseCodeEnum.SERVER_ERROR, "删除RAM子账户失败");
}
}


本文作者:Odboy
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC 4.0 BY-SA 许可协议。转载请注明出处!