Spring MongoTemplate不是正在进行的交易的一部分

时间:2019-04-01 21:29:39

标签: spring-data-mongodb spring-transactions

现在我正在尝试通过Spring Data Mongo过渡到使用MongoDB事务,因为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 也可以参与其他正在进行的交易。

可以解释为该模板可以用于不同的事务,而不一定是隐式事务。但这不是该示例所要说明的。

有什么想法吗?如何获得模板来参与相同的隐式交易?

0 个答案:

没有答案