프로시저 실행 시 누락현상 질문 0 2 1,143

by 띵똥 [2019.03.25 08:54:08]


아주 가끔 발생하는 현상인데 원인을 못찾아서 질문드립니다 ㅜㅜ

프로시져A 실행 시

1. 조회 후 프로시져B 실행(단순히 조회된 정보로 테이블A INSERT)

2. B테이블 DELETE

3. 프로시져C 실행(단순히 조회된 정보로 테이블B INSERT)

이렇게 되어있습니다.

그런데 간혹 1,2번만 실행되고 3번이 실행되지 않는 경우가 있습니다...(3~4달에 한번, 하루 처리데이터는 약 2800건)

다시 원복시키고 해보면 잘 되구여.. 한 트랜잭션 안에서 전부 실행이 되야지 끝나는게 아닌지..

어떤 경우에 이런 현상이 발생할 수 있는지 궁금합니다

by 신이만든지기 [2019.03.25 19:06:41]

오라클이라고 가정하고 말씀드립니다.

프로시저내에서 commit의 위치가 어딨느냐와 exception 처리를 어떻게 했느냐에 따라 결과가 달라집니다.

질문하신 대로라면, 프로시저들 간의 중첩관계를 도식화하면 아래와 같습니다.

프로시저A
프로시저B

테이블A Insert 작업

-- Commit 1

테이블B Delete작업

-- Commit 2

프로시저C

테이블B Insert 작업

-- Commit 3

-- Commit 4

 

4번위치에서 커밋을 한번만 하면, 말씀하신 대로, 3개의 작업이 모두 실행되거나 되지 않거나 입니다.

그런데 1번, 2번, 3번 위치에 하나라도 커밋이 있다면, 해당위치까지는 커밋이 처리됩니다.

말씀하신 내용대로라면 소스 처음부터 2번위치사이에 적어도 1번의 커밋이 있을 거라 예상되네요. 그래서 프로시저의 작업이 부분적으로 처리된 것입니다.

프로시저C 에서 에러가 발생하는 것으로 보이니 프로시저 C의 exception에 에러 로그를 넣는 작업을 진행하시면 되겠습니다. 에러로그는 별도의 테이블을 하나 생성하여 넣으면 됩니다.

이후 동일한 에러가 발생하면 에러로그 테이블을 확인하시면 되겠죠.


by 띵똥 [2019.04.01 10:11:06]

답변 감사드립니다.

일단 화면단에서 프로시져를 호출하고 커밋 역시 프로시저A가 끝나면 처리됩니다.

혹시 몰라 내부 프로시저 B,C도 확인해보았으나 커밋하는 부분은 없습니다..

조언해주신대로 프로시저 C에  exception처리로 로그를 쌓아봐야겠네요....

근데 로그는 안쌓이고...동일한 에러가 또 발생하면...어느부분을 찾아야할까요?! ㅜㅜ

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입