【问题标题】:Deleting a record then selecting within the same Spring Transaction still returns the deleted record删除记录然后在同一个 Spring Transaction 中选择仍然返回删除的记录
【发布时间】: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


【解决方案1】:

事务尚未提交,需要先完成事务再查找记录。

使用propagation = Propagation.REQUIRES_NEW) 装饰deleteRecord 应该可以解决问题

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void deleteRecord(EntityObj entityObj) {
    fooRepository.deleteById(entityObj.getId());
    // flush not needed fooRepository.flush();
}

不需要刷新,因为当 deleteRecord 完成时,翻译将被提交。

幕后

//start transaction
public void deleteRecord(EntityObj entityObj) {

    fooRepository.deleteById(entityObj.getId());

}
//commit transaction

【讨论】:

    【解决方案2】:

    原来问题是由于我们使用了 Hystrix。事务在 Hystrix 之外启动,然后在稍后通过 Hystrix 命令。 Hystrix 命令正在使用线程池,因此在 Hystrix 线程池中的新线程上执行时事务会丢失。有关更多信息,请参阅此 github 问题: https://github.com/spring-cloud/spring-cloud-netflix/issues/1381

    【讨论】:

    猜你喜欢
    • 2021-12-02
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 2016-07-22
    • 2020-11-26
    • 1970-01-01
    相关资源
    最近更新 更多