如何使用springdatareactivemongodbtransactionalOperator来限制事务范围



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

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

save(a(未参与tx

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个回滚。但transactionOperator似乎从一开始就开始了事务,具有会话同步ON_ACTUAL_transaction的mongo也参与了事务。如何限制tx范围?

我发现我应该用另一种方式调用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();

最新更新