我编写了一个springboot GET API,它从SQL数据库表中获取所有行。一开始效果很好。但是,在我从数据库表中删除了几行之后,然后再次运行GET API,它将返回表中的所有行以及我刚刚删除的行。
看起来删除事务没有正确处理。我在中检查了表,并验证了行被删除。只是不确定GET API为什么仍然返回这些已删除的行。
这是由于springboot应用程序中没有提交sql的delete事务造成的吗?如果是这样的话,我如何在springboot中跟踪事务处理?我的刀层:
import java.util.List;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Repository;
import lombok.extern.slf4j.Slf4j;
import app.entity.Restriction;
@Slf4j
@Repository
public class RestrictionDaoImpl implements RestrictionDao {
private final NamedParameterJdbcTemplate namedParameterJdbcTemplate;
private static final String GET_ALL_RESTRICTIONS = " SELECT * FROM RPO_RESTRICTION_CRITERIA ";
private static final RestrictionRowMapper RESTRICTION_ROW_MAPPER = new RestrictionRowMapper();
public RestrictionDaoImpl(@Qualifier("aeVaultNamedParameterJdbcTemplate")
NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
}
@Override
public List<Restriction> getAllRestrictions() {
List<Restriction> restrictions = this.namedParameterJdbcTemplate.query(GET_ALL_RESTRICTIONS, RESTRICTION_ROW_MAPPER);
return restrictions;
}
}我检查了我的dao层,在查询和namedParameterJdbcTemplate中找不到任何错误。我还需要检查其他文件/代码吗?
发布于 2022-10-08 05:14:35
尝试重新启动IDE,否则将这两个spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true添加到application.properties中
发布于 2022-10-13 00:20:40
您的代码示例不包含@Transactional边界,因此我将假设您在调用@Repository方法的层(即服务或控制器)中正确地定义了它们。
我不是Oracle专家,但据我所知,Oracle不允许脏读取,即事务永远无法读取并发事务的未提交更改。您说它“一开始工作得很好”,这也意味着您正确地设置和使用了@Transactional边界,并且删除操作实际上已经提交。
在任何情况下,您都可以启用和检查数据库日志,以确认是否同时发生了删除和提交。
您还会说“已删除的行再次出现”,这意味着它们在之前就消失了,这又是一个表明delete工作的指示。OTOH,这使我认为可能有第三个参与者访问和更改您的数据库(第一个是Spring应用程序,第二个是SQL Developer):
periodically?
发布于 2022-10-13 15:52:23
我编写了一个delete API并调用它来删除表中的数据。然后,当我再次调用getAllRestriction API时,被delete API删除的行不会返回。但是,我仍然想弄清楚为什么Sql删除的行是由sql返回的,并且在我重新启动sql之后,删除的行将再次出现。
问题解决了。我发现sql开发人员的自动提交已经关闭,所以每次我删除一行时,事务都没有提交。我在中添加了“commit;”来手动提交,然后GET API将不会返回已删除的行。
https://stackoverflow.com/questions/73993803
复制相似问题