编辑
2025-08-18
编程语言-Java
00
请注意,本文编写于 234 天前,最后修改于 0 天前,其中某些信息可能已经过时。

目录

根据最佳实践,建议的操作顺序如下:
原因分析
控制层中事务是否回滚问题

Spring 声明式事务(@Transactional)是保证数据一致性的核心手段,但使用不当会导致预期外的回滚行为。本文通过两个实战场景,深入讲解 Spring Boot 中事务的正确使用方式。第一部分:建议的数据库与外部服务操作顺序——先调用阿里云 API 创建 RAM 子账号(外部服务),确认成功后再将信息写入数据库,避免因子账号创建失败导致数据库中产生无效记录。第二部分:Controller 层捕获异常时的事务回滚问题——即使外层 try-catch 捕获了异常,被 @Transactional(rollbackFor = Exception.class) 注解的 Service 方法内部抛出异常后,事务依然会回滚;异常被捕获并不会阻止事务回滚,因为 Spring 事务管理器在方法抛出异常时即标记回滚。

本文适用于使用 Spring Boot 进行事务管理的开发者。

根据最佳实践,建议的操作顺序如下:

  1. 先调用阿里云服务创建RAM子账号

    • 确保子账号在阿里云上成功创建,并获取到相关的子账号信息(如子账号ID、名称等)。
    • 这一步确保了子账号的实际存在性和有效性。
  2. 再将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子账户失败"); } }
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Odboy

本文链接:

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