문제 발생
스프링으로 @Scheduled를 실행하려고 했는데 ORA-01002: fetch out of sequence라는 오류가 떴다. 코드를 아무리 봐도 틀린 게 없고.. 저 오류가 뭘까 찾아보았다.
오류 정의
ORA-01002: fetch out of sequence
Oracle 데이터베이스에서 발생하는 오류로서, 일련의 결과 집합에서 데이터를 검색하려고 할 때 순서가 맞지 않는 경우에 발생한다. 이 오류는 주로 JDBC(Java Database Connectivity)나 SQL*Plus 등을 사용하여 Oracle 데이터베이스에 연결하고 작업할 때 나타난다.
흠.. 오케이 근데 fetch가 뭔데...?
fetch는 커서에서 원하는 결과값을 추출하는 동작을 나타내며 커서는 쿼리문에 의해서 반환되는 결괏값들을 저장하는 메모리 공간이다. Oracle 데이터베이스에서 결과 집합을 순서대로 가져올 때는 각 행을 순차적으로 처리하는 것이 중요하다. 만약 데이터를 가져오는 순서가 예상과 다르거나, 이전에 가져온 데이터가 아직 처리되지 않은 상태에서 다음 데이터를 가져오려고 하면 이 오류가 발생하게 된다.
발생 원인
찾아보니 이 오류는 주로 다음과 같은 상황에서 발생한다고 한다.
- ResultSet 순서 문제: 데이터를 검색하는 ResultSet이나 Cursor를 사용하는 경우에 발생할 수 있다. 예를 들어, 어떤 데이터를 검색하고 그다음에 다른 데이터를 검색하려고 할 때, 순서가 맞지 않으면 이 오류가 발생할 수 있다.
- 커서 관리 문제: 데이터베이스 커서를 제대로 열고 닫지 않은 경우나, 커서의 위치를 제대로 조정하지 않은 경우에도 이 오류가 발생할 수 있다.
- 멀티스레드 환경: 멀티스레드 환경에서 동시에 여러 스레드가 같은 ResultSet을 사용하거나 관리하는 경우에도 이 오류가 발생할 수 있다.
해결
내 코드를 보니 아래 처럼 두 개의 쿼리를 @Scheduled을 통해 동시에 처리해서 발생되는 오류 같았다.
HBService.delete(boardNum);
PGService.delByBoardNum(vo.getBoardNum());
그래서 PGService.delByBoardNum 에서 HBService.delete를 실행 하도록 하기와 같이 고쳐 주었다.
PGService.delByBoardNum(vo.getBoardNum());
|
V
public void delByBoardNum(int boardNum) {
dao.deleteByBoardNum(boardNum);
HBService.delete(boardNum);
}
'SQL' 카테고리의 다른 글
[SQLD] 데이터 모델과 SQL (0) | 2023.09.08 |
---|---|
[SQLD] 데이터 모델링의 이해 (1) | 2023.09.07 |
ORA-02292 해결 방법 (0) | 2023.07.10 |
[Oracle] 새 접속 만들기 (1) | 2023.05.14 |
SQL 문법 _ 오라클 9i introduction 2장 문제 (0) | 2023.03.19 |