【问题标题】:Spring Transactional not rolling back on exceptionSpring Transactional 不回滚异常
【发布时间】:2019-06-30 13:13:41
【问题描述】:

我有以下两种方法使用Spring data JPA的MongoRepository将单个用户和多个用户存储在mongodb中。如果方法中发生任何异常,则不会回滚。我可以在数据库中找到数据。

@Override
@Transactional(propagation = Propagation.REQUIRED)
public UserRequest save(UserRequest userRequest) throws UserException {
    logger.info("Saving the user information {} ", userRequest);
    User user = new User(sequenceService.getNextSequenceFor(SequenceNames.USER));
    if("admin".equals(userRequest.getFirstName())) {
        throw new UserException("Resvered name canot be used : " + userRequest.getFirstName());
    }
    BeanUtils.copyProperties(userRequest, user,"id");
    user = userRepository.save(user);
    userRequest.setId(user.getId());
    return userRequest;
}


@Override
@Transactional
public List<UserRequest> save(List<UserRequest> users) throws UserException {
    for (UserRequest userRequest : users) {
        save(userRequest);
    }
    return users;
}


@Repository
public interface UserRepository extends MongoRepository<User, String> {

}

用户请求:

[
    {
        "firstName": "John",
        "lastName": "A",
        "mobileNo": "9898989892",
        "emailId": "john.a@gmail.com"
    },
    {
        "firstName": "admin",
        "lastName": "A",
        "mobileNo": "9898989892",
        "emailId": "admin.a@gmail.com"
    }
]

此代码将 John 的数据保存在数据库中。它仅对用户 admin 进行回滚。它不会回滚所有用户数据。没有发生部分回滚。

【问题讨论】:

  • 调用保存方法的代码在哪里?
  • 异常应该是 RuntimeException Spring Transactions 任何 RuntimeException 都会触发回滚,而任何已检查的异常都不会。 要发生回滚,您可以使用 @Transactional(rollbackFor = UserException.class)

标签: spring spring-boot spring-data spring-data-mongodb spring-transactions


【解决方案1】:

在第 4 版之前,MongoDB 一直只支持原子性 on the level of a single document。 Spring Data Mongo 没有提供任何额外的功能来克服这个缺点。但是,从 MongoDB 4 和 Spring Data Mongo 2.1 开始,这可以通过配置 MongoTransactionManager 来实现,请参阅 Spring Data Mongo documentation。但是,我不确定是否有任何 Propagation 选项(来自 JPA 规范)适用于 MongoDB 事务功能。

【讨论】:

    猜你喜欢
    • 2015-02-12
    • 2020-10-18
    • 2017-04-14
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 2018-11-08
    • 2016-12-19
    • 1970-01-01
    相关资源
    最近更新 更多