首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Springboot GET API从oracle sql数据库表返回已删除的值。

Springboot GET API从oracle sql数据库表返回已删除的值。
EN

Stack Overflow用户
提问于 2022-10-08 01:33:50
回答 3查看 87关注 0票数 0

我编写了一个springboot GET API,它从SQL数据库表中获取所有行。一开始效果很好。但是,在我从数据库表中删除了几行之后,然后再次运行GET API,它将返回表中的所有行以及我刚刚删除的行。

看起来删除事务没有正确处理。我在中检查了表,并验证了行被删除。只是不确定GET API为什么仍然返回这些已删除的行。

这是由于springboot应用程序中没有提交sql的delete事务造成的吗?如果是这样的话,我如何在springboot中跟踪事务处理?我的刀层:

代码语言:javascript
复制
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中找不到任何错误。我还需要检查其他文件/代码吗?

EN

回答 3

Stack Overflow用户

发布于 2022-10-08 05:14:35

尝试重新启动IDE,否则将这两个spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true添加到application.properties中

票数 1
EN

Stack Overflow用户

发布于 2022-10-13 00:20:40

您的代码示例不包含@Transactional边界,因此我将假设您在调用@Repository方法的层(即服务或控制器)中正确地定义了它们。

我不是Oracle专家,但据我所知,Oracle不允许脏读取,即事务永远无法读取并发事务的未提交更改。您说它“一开始工作得很好”,这也意味着您正确地设置和使用了@Transactional边界,并且删除操作实际上已经提交。

在任何情况下,您都可以启用和检查数据库日志,以确认是否同时发生了删除和提交。

您还会说“已删除的行再次出现”,这意味着它们在之前就消失了,这又是一个表明delete工作的指示。OTOH,这使我认为可能有第三个参与者访问和更改您的数据库(第一个是Spring应用程序,第二个是SQL Developer):

periodically?

  • Finally,

  • 是数据库远程的吗?

  • 是其他开发人员或服务可以访问的数据库?

  • 是任何自动化进程使用的数据库,例如在运行前可能恢复数据库的生成机器上运行的测试?

  • 是否设置了复制,您是否有可能连接到与源同步的副本?您是否有可能运行生成保持re-appearing?的数据的测试?
票数 1
EN

Stack Overflow用户

发布于 2022-10-13 15:52:23

我编写了一个delete API并调用它来删除表中的数据。然后,当我再次调用getAllRestriction API时,被delete API删除的行不会返回。但是,我仍然想弄清楚为什么Sql删除的行是由sql返回的,并且在我重新启动sql之后,删除的行将再次出现。

问题解决了。我发现sql开发人员的自动提交已经关闭,所以每次我删除一行时,事务都没有提交。我在中添加了“commit;”来手动提交,然后GET API将不会返回已删除的行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73993803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档