在 spring data mongo 与 cosmos DB 交互中使用来自 mongoTemplate 的批量操作时的事务行为

问题描述 投票:0回答:1

我想了解以下代码是否会使用单个事务更新批次。

BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, SomeEntity.class);
    for (SomeVO SomeVO : SomeVOList) {
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(SomeVO.getId()));
        Update update = new Update();
        for (Field field : SomeVO.class.getDeclaredFields()) {
            field.setAccessible(true);
            Object value;
            try {
                value = field.get(SomeVO);
            } catch (IllegalAccessException e) {
                continue;
            }

            if (value != null && !field.getName().equals("id")) {
                update.set(field.getName(), value);
            }
        }
        bulkOps.updateOne(query, update);
    }
    BulkWriteResult result = bulkOps.execute();

只是想了解一下

bulkOps.execute() 

以全有或全无的方式处理更新?当将 spring-data-mongo 与 cosmosDB 一起使用时

azure-cosmosdb spring-data-mongodb mongotemplate
1个回答
0
投票

不,默认情况下,在将 Spring Data MongoDB 与 Cosmos DB 结合使用时,bulkOps.execute() 不会以全有或全无的方式处理更新。 bulkOps操作是单独执行的,如果一次更新失败,不会回滚之前成功的更新。这意味着您最终可能会得到部分更新,其中某些文档已更新,而其他文档则未更新。

要实现全有或全无(事务)行为,您需要在事务中执行批量操作。

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