作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我为 micronaut 微服务编写了一些测试。我希望在我的测试完成后,数据库中的所有更改都被还原(回滚)。首先,我写了一个简单的例子,它似乎有效。更改被还原。但是当我使用相同的类比运行微服务测试时,更改不会恢复。
简单的工作示例:
@Test
@Transactional
public void testRollback() {
try (Connection connection = dataSource.getConnection();
Statement stmt = connection.createStatement()){
connection.setAutoCommit(false);
stmt.execute(String.format("INSERT INTO city VALUES (9999, 'Darko town', '123')"));
connection.rollback();
} catch (SQLException e) {
Assert.fail("Exception " + e);
}
}
@Test
@Transactional
public void testDeleteDocuments() {
try (final Connection connection = deletionService.getDataSource().getConnection();
Statement stmt = connection.createStatement()) {
connection.setAutoCommit(false);
deletionService.startHacDeletion();
connection.rollback();
}catch (SQLException e) {
Assert.fail("Exception " + e);
}
}
DeletionService.startHacDeletion()
没有恢复。
public void deleteHacDocuments () {
List<Document> allComments = new ArrayList<>();
while (hacDeletionActive) {
List<Document> parentDocuments = documentRepository.findHacDocuments();
LOG.info(String.format("Remove HAC parent documents %d", parentDocuments.size()));
for(Document document : parentDocuments){
LOG.info(String.format("Remove HAC documents %d", document.getId()));
}
if (parentDocuments.isEmpty()) {
hacDeletionActive = false;
LOG.info("HAC deletion finished");
} else {
for (Document doc : parentDocuments) {
if (doc.getType() == 1) {
deleteWholeStudy(doc.getId());
} else if (doc.getType() == 6) {
List<Document> studies = documentRepository.findStudiesByCase(doc.getId());
for (Document study : studies) {
deleteWholeStudy(study.getId());
}
deleteWholeCase(doc.getId());
} else if (doc.getType() == 4) {
allComments.add(doc);
} else {
documentService.markDocumentAsDeleted(doc.getId());
}
}
documentService.markCommentsAsDeleted(allComments);
}
}
}
最佳答案
我对Micronaut框架不是很熟悉,也不太明白为什么@Transactional
如果您手动回滚更改,则需要注释。
但是从您的示例中可以明显看出,在第一种情况下,您使用 connection
创建一个 statement
用于执行查询,然后您在同一个 connection
上调用回滚.
在第二种情况下,您会得到 connection
来自 DataSource
,但您没有将其传递给服务来使用它,因此如果 DataSource
使用一些连接池并且不总是返回相同的连接,服务将获得另一个connection
从它,而不是你正在回滚的那个。
这是我在您的代码中看到的唯一可能的问题,如果我的回答不能帮助您解决问题,请提供 a minimal, reproducible example .
关于java - Micronaut 和 JUnit 回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59663002/
我是一名优秀的程序员,十分优秀!