Spring Transactional不会因异常而回退

时间:2019-02-06 14:37:58

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

我有以下两种方法,可以使用Spring数据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的数据保存在数据库中。仅针对用户管理员回滚。它不会回滚所有用户数据。不会发生部分回滚。

1 个答案:

答案 0 :(得分:0)

在版本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事务功能。