【发布时间】:2019-06-05 02:44:18
【问题描述】:
我在隔离级别设置为 SERIALIZABLE 的 spring 事务中有一些代码。这段代码做了几件事,首先从表中删除所有设置了标志的记录,然后执行选择以确保无法写入无效记录,最后写入新记录。
问题在于,如果使用事务注释运行代码,则选择会继续返回已删除的记录。我的理解是,因为我们在同一个spring事务中执行这些操作,所以在执行选择时会考虑之前的删除操作。
我们使用的是 Spring Boot 2.1 和 Hibernate 5.2
代码总结如下:
@HystrixCommand
public void deleteRecord(EntityObj entityObj) {
fooRepository.deleteById(entityObj.getId());
//Below line added as part of debugging but I don't think I should really need it?
fooRepository.flush();
}
public List<EntityObj> findRecordByProperty(final String property) {
return fooRepository.findEntityObjByProperty(property);
}
@Transactional(isolation = Isolation.SERIALIZABLE)
public void debugReadWrite() {
EntitiyObject entitiyObject = new EntityObject();
entitiyObject.setId(1);
deleteRecord(entitiyObject);
List<EntityObj> results = findRecordByProperty("bar");
if (!results.isEmpty()) {
throw new RuntimeException("Should be no results!")
}
}
【问题讨论】:
-
.flush()应该可以解决您的问题。 -
事务尚未提交,需要先完成事务再查找记录。这可以通过两种方法来完成,带有 REQUIRES_NEW
标签: spring hibernate spring-boot jpa hystrix