现在我正在尝试通过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 也可以参与其他正在进行的交易。
可以解释为该模板可以用于不同的事务,而不一定是隐式事务。但这不是该示例所要说明的。
有什么想法吗?如何获得模板来参与相同的隐式交易?