0

出于性能原因,我需要减少 tx 范围。例如

reactiveMongoTemplate.save(a)
    .then(
        reactiveMongoTemplate.inTransaction().execute(rmo -> methodInTx(rmo, trade))
    )
    .subscibe()

save(a) 不参与交易

ReactiveMongoTemplate.inTransaction() 自 2.2 起已弃用。

我试过 TransactionalOperator,它似乎不支持作用域事务

    mongo.setSessionSynchronization(SessionSynchronization.ON_ACTUAL_TRANSACTION);
    txMongo.setSessionSynchronization(SessionSynchronization.ALWAYS);

    mongo.save(a, A.class)
            .flatMap(aa -> {
                aa.value = 1;
                return mongo.save(aa);
            })
            .flatMap(aa -> {
                aa.value = 2;
                return txMongo.save(aa).map(aaa -> {
                    if (true) throw new RuntimeException();
                    return aaa;
                });
            })
            .as(transactionalOperator::transactional)
            .doOnError(e -> e.printStackTrace()).subscribe();

我希望值设置为 1,只有 2 回滚。但是似乎transationalOperater从一开始就开始了事务,带有会话同步ON_ACTUAL_TRANSACTION的mongo也参与了事务。如何限制 tx 范围?

4

1 回答 1

0

我原来应该以另一种方式调用 transactionalOperator

    mongo.save(a, A.class)
        .flatMap(aa -> {
            aa.value = 1;
            return mongo.save(aa);
        })
        .flatMap(aa -> {
            aa.value = 2;
            return transactionalOperator.execute(s -> 
                mongo.save(aa).map(aaa -> {
                    if (true) throw new RuntimeException();
                    return aaa;
                })
           ).reduce((a, b) -> a);
        })
        .doOnError(e -> e.printStackTrace()).subscribe();
于 2020-12-15T21:44:06.817 回答