如果批量发布请求中存在无效条目,则不会发生回滚(Spring Boot)

问题描述 投票:0回答:1
@Transactional(rollbackFor = Exception.class)
@PostMapping(value = "/{table}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.CREATED)
Object executeInsertQuery(@PathVariable("table") String tableName, @RequestBody Object requestBody) {
  if (requestBody == null) {
    throw new RestifyDbException(RestifyDbErrorCode.ERR_BAD_REQUEST_NO_BODY);
  }

  if (requestBody instanceof List<?>) {
    List<Object> result = new ArrayList<>();
    List<Map<String, Object>> list = (List<Map<String, Object>>) requestBody;
    for (Map<String, Object> entry : list) {
      Object object = executeInsertQuery(tableName, entry, true);
      if (object != null) {
        result.add(object);
      }
    }
    return CollectionUtils.isEmpty(result) ? null : result;
  } else {
    return executeInsertQuery(tableName, (Map<String, Object>) requestBody, false);
  }
}


  public Object executeInsertQuery(String tableName, Map<String, Object> requestBody,
                                    boolean ignoreRepresentationHeadersOnly){

// insert code
 
  }

此处为请求正文:

[
    {"title":"title1","language_id":1},
    {"title":"title2","language_id":100}
]

条目 1 有效 条目 2 无效,因为 language_id 100 是一个错误

所以程序会崩溃,但条目 1 被执行..

我预计条目 1 会被回滚,但它没有发生。我们对条目 1 执行的查询并保存在 postgresql 中。

有人可以帮我吗?

java spring-boot jdbc transactions
1个回答
0
投票

您似乎在 Spring Boot 应用程序中使用 @Transactional 注释来管理事务。但是,需要检查一些事项以确保正确管理交易:

交易配置: 确保您的应用程序中具有适当的事务管理配置。通常,您会有一个用 @EnableTransactionManagement 注释的配置类。例如:

@Configuration
@EnableTransactionManagement
public class TransactionConfig {
    // additional configuration if needed
}

交易传播: 确保事务传播设置正确。默认情况下,Spring的@Transactional注解的传播级别为REQUIRED,这意味着如果已经存在事务,则该方法将参与其中;否则,将创建一个新交易。

@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)

异常处理: 检查事务方法内抛出的异常类型是否正确。默认情况下,具有 RestifyDbErrorCode.ERR_BAD_REQUEST_NO_BODY 的 RestifyDbException 可能不会触发回滚。确保您的自定义异常 (RestifyDbException) 或其超类扩展 RuntimeException 或使用 @Transactional(rollbackFor = ...) 进行注释。例如:

@Transactional(rollbackFor = RestifyDbException.class)

检查运行时异常: 默认情况下,Spring 中的事务仅针对未检查的异常(扩展 RuntimeException 的异常)进行回滚。确保您想要触发回滚的任何异常都是未经检查的异常。

throw new RuntimeException("This will trigger a rollback");

如果您的 RestifyDbException 是受检查异常,您可能需要在 rollbackFor 属性中显式指定它。

如果您有多个相互调用的事务方法,还要检查这些方法是否遵守 @Transactional 注释。

请记住首先使用简单的案例测试您的代码,以确保事务行为按预期工作。如果问题仍然存在,请考虑提供有关事务配置以及事务期间引发的特定异常类型的更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.