Spring MongoTemplate не является частью текущей транзакции - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь перейти на использование транзакций 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 также может участвовать в других текущих транзакциях.

, что может означать, что шаблон может использоватьсяс разными транзакциями, и не обязательно неявная транзакция.Но это не то, на что указывает пример.

Любые идеи о том, что происходит или как получить шаблон для участия в той же неявной транзакции?

...