Я пытаюсь перейти на использование транзакций MongoDB через Spring Data Mongo, теперь, когда MongoDB 4.0 поддерживает транзакции, и Spring Data Mongo 2.1.5. Release также поддерживает это.
Согласно документации Spring Data Mongoвы должны иметь возможность использовать Spring MongoTransactionManager и иметь MongoTemplate для распознавания и участия в текущих транзакциях: https://docs.spring.io/spring-data/mongodb/docs/2.1.5.RELEASE/reference/html/#_transactions_with_mongotransactionmanager
Однако этот следующий тест не пройден:
@Autowired
private TestEntityRepository testEntityRepository;
@Autowired
private MongoTemplate mongoTemplate;
@BeforeTransaction
public void beforeTranscation() {
cleanAndInitDatabase();
}
@Test
@Transactional
public void transactionViaAnnotation() {
TestEntityA entity1 = new TestEntityA();
entity1.setValueA("a");
TestEntityA entity2 = new TestEntityA();
entity2.setValueA("b");
testEntityRepository.save(entity1);
testEntityRepository.save(entity2);
// throw new RuntimeException("prevent commit");
List<TestEntityA> entities = testEntityRepository.findAll(Example.of(entity1));
Assertions.assertEquals(1, entities.size()); // SUCCEEDS
entities = testEntityRepository.findAll(Example.of(entity2));
Assertions.assertEquals(1, entities.size()); // SUCCEEDS
entities = mongoTemplate.findAll(TestEntityA.class);
Assertions.assertEquals(2, entities.size()); // FAILS - expected: <2> but was: <0>
}
Похоже, чтоtestEntityRepository прекрасно работает с транзакцией.Утверждения выполняются успешно, и если я раскомментирую строку исключения, ни одна из записей не будет сохранена в базе данных.
Однако попытка использовать mongoTemplate напрямую для выполнения запроса не работает, так как кажется, что он не участвует в транзакции.
Документация, которую я связал, показывает использование шаблона напрямую в методе @ Transactional , как я пытаюсь.Тем не менее, текст гласит:
MongoTemplate также может участвовать в других текущих транзакциях.
, что может означать, что шаблон может использоватьсяс разными транзакциями, и не обязательно неявная транзакция.Но это не то, на что указывает пример.
Любые идеи о том, что происходит или как получить шаблон для участия в той же неявной транзакции?