SpringBoot GET接口返回Oracle数据库已删除数据问题排查
排查方向与检查要点
1. 确认SQL Developer的事务提交状态
SQL Developer默认是手动提交事务,删除数据后如果没有执行COMMIT;语句,数据库的变更不会对其他会话可见。你可以在SQL Developer里重新查询表确认数据是否真的被持久化删除,同时检查是否开启了自动提交(路径:工具-首选项-数据库-高级)。
2. 检查SpringBoot的数据库连接配置
- 查看连接池的
autoCommit设置:比如HikariCP的spring.datasource.hikari.auto-commit,如果设为false且查询没有显式提交事务,可能会读取到连接内未提交的旧数据快照。 - 确认事务隔离级别:Oracle默认是
READ COMMITTED,如果SpringBoot配置了REPEATABLE READ或更高级别,同一连接内的查询可能重复读取旧数据。可检查配置文件中的spring.datasource.hikari.transaction-isolation参数。
3. 排查是否存在缓存机制
检查调用DAO的上层Service或Controller方法是否添加了@Cacheable注解,或者是否使用了本地缓存、Redis等分布式缓存。如果查询结果被缓存,数据库数据删除后缓存未失效,接口会直接返回旧缓存数据。
4. 检查上层方法的事务边界
如果getAllRestrictions()被包裹在未提交的事务中(比如上层Service方法带有@Transactional注解且事务未正常闭合),Oracle的读一致性机制会让该事务内的查询始终读取事务启动时的数据快照。需要检查Service/Controller层的事务注解配置,确认事务是否正确提交或回滚。
5. 开启日志追踪事务与SQL执行
在application.properties中添加日志配置,追踪实际执行细节:
# 开启JDBC执行日志 logging.level.org.springframework.jdbc=DEBUG logging.level.oracle.jdbc=DEBUG # 开启Spring事务日志 logging.level.org.springframework.transaction=DEBUG
通过日志可查看:
- 查询SQL是否真的发送到数据库执行
- 事务的开启、提交、回滚状态
- 数据库连接的复用与事务上下文信息
6. 验证数据库连接的独立性
重启SpringBoot应用后再次调用接口,如果返回正确的删除后数据,说明是连接池中的旧连接持有了未提交的事务快照。此时需检查连接池的回收策略,或配置连接池在借用连接时验证状态(如HikariCP的spring.datasource.hikari.connection-test-query=SELECT 1 FROM DUAL)。
内容的提问来源于stack exchange,提问作者Henry Bai
相关产品推荐
相关产品推荐

