如何使用 Spring Boot 修复 Shard Mongo DB 中的 TransientTransactionError?

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

场景:

  1. 我正在使用带有 Spring Boot 的 Mongo DB 6+ 版本。
 @Bean
    MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) {
        return new MongoTransactionManager(dbFactory);
    }
 @Transactional
    public void save(Cart cart,Item item) {
        Cart cartFromDB = cartRepo.findById(cart.getId());
        if(cartFromDB!= null){
            cart.setId(cartFromDB.getId());
            cartRepo.save(cart);
        }else{
            cartRepo.save(cart);
        }
        itemRepo.save(item);
    }
  1. 我正在使用
    @Transactional
    在同一事务中保存两个不同的文档。
  2. 我有带有副本集的 Mongo DB,它工作正常,没有任何错误..
  3. 现在 Mongo DB 已改为使用分片。
  4. 我怀疑进行此更改后,我会间歇性地收到 TransientTransactionError 。手动尝试几次后成功了
  5. 当我实施重试时,它成功了。

错误信息:

com.mongodb.MongoCommandException: Command failed with error 13388 (StaleConfig): 'Transaction sd-ef6d-dsd-83bd-fsdfdf - dfdfdfdfdsdfdsfsd= -  - :1 was aborted on statement 2 due to: an error from cluster data placement change :: caused by :: Encountered error from mongodb.cluster.local:26009 during a transaction :: caused by :: sharding status of collection mongodb.item is not currently known and needs to be recovered' on server mongos.xxxx.com:27017. The full response is {"ok": 0.0, "errmsg": "Transaction c43f42bd-ef6d-4c48-83bd-fgdfgsdfsgf - fgggeddddsksduydhdhsh= -  - :1 was aborted on statement 2 due to: an error from cluster data placement change :: caused by :: Encountered error from mongodb.cluster.local:26009 during a transaction ::..... "errorLabels": ["TransientTransactionError"]}

问题:

java database mongodb spring-boot sharding
1个回答
0
投票

TransientTransactionError
被认为是可能暂时且可重试的错误,如此处所述。因此,您可以尝试以旧样式(请参阅此处)或更好的方式手动重试,建议使用这种方式,以使用相对较新的方法
WithTransaction
在幕后处理重试逻辑。我没有使用
spring-boot
,所以不确定它如何在那里调用,所以你必须另外调查

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