出于性能原因,我需要减少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();