ORA-00001: unique constraint 에러 발생시 Rollback / Commit 문의 0 10 3,203

by 코리아 [DB 기타] ORA-00001 unique constraint [2017.09.07 15:16:11]


안녕하세요

Oracle 에러 발생 관련하여 문의 드립니다. (ver. 11g)

 

[현상]

merge문을 사용하여 데이터가 있으면 update 하고 없으면 insert 하려고 구현되어 있습니다.

하지만 merge문이 동시다발적으로 유입이 되어 서로 insert 를 하려다가 ORA-00001: unique constraint 가 발생 됨

이후 테이블 Lock 발생

 

[문의]

ORA-00001: unique constraint  에러가 발생되면 기본적으로 Rollback 처리가 되는 것으로 알고 있습니다.

아래 문의사항에 답변 부탁드립니다~!

 

1. ORA-00001: unique constraint  에러가 발생되면 Rollback 이 되나요?

2. Rollback 수행이 된다면 실패되는 경우도 있나요? 

 

 

확인 부탁 드립니다~!

 

 

by jkson [2017.09.07 15:28:46]

에러가 나면 트랜잭션이 rollback 되는 게 아니고 rollback을 해줘야 rollback이 되겠죠.

트랜잭션 시작

insert into table values('1') -- pk 항목

insert into table values('1') -- pk 항목

commit;

트랜잭션 종료

첫 번째 성공 후 두 번째 쿼리가 실패했다하여 첫 번째 데이터가 롤백되지 않잖아요.

제약사항에 따라 데이터 변경이 안 된 것뿐이지 롤백된 게 아니죠.

어떤 의도로 질문하신 것인지요?


by 우리집아찌 [2017.09.07 15:48:59]

EXCEPTION 처리 안하시나요?


by 코리아 [2017.09.07 16:01:04]
try {
        // EXEC Query
        stmt.ExecuteArrayUpdate(numArrayRows);

        int nAffectedRows = ((Statement*)stmt)->getUpdateCount();
        if (nAffectedRows == 0) {
            m_Reason = eResNotFound;
            stmt.Rollback();
        } else if ( nAffectedRows != hmInfoList.size() ) {
            m_Reason = eResEtcFail;
            stmt.Rollback();
            EELOG(RED(FN << "Different update count map.size(" << hmInfoList.size() << ") : AffectedRows(" << nAffectedRows << ")"));
        } else {
            stmt.Commit();
            DDLOG(FN << "xxxx" 
                    << " AffectedRows:" << nAffectedRows
                 );
        }
        iAffectedCnt = nAffectedRows;
    } catch(SQLException ex) {
        CheckErrorCode( ex.getErrorCode() );
        EELOG(RED(FN << "code: " << ex.getErrorCode() << ", " << ex.what()));
    }

 

EXCEPTION  처리 구간에서 발생 된 에러입니다. 

코드에서 catch구문에는 commit, rollback 처리함수는 없네요


by 코리아 [2017.09.07 15:54:55]

답변감사드립니다^^;

ORA-00001: unique constraint 발생되면 Oracle DB에서 Rollback이 자동으로 발생되는지 여부의 문의였습니다.

그럼 ORA-00001: unique constraint 발생되면 어플리케이션 에서 commit or rollback 구문을 넣어줘야 되는건가요?


by 우리집아찌 [2017.09.07 15:59:45]

MS-SQL은 보통 AUTO COMMIT 이라 상관없지만

오라클은 어플리케이션에서 EXCEPTION 처리해서 에러시 ROLLBACK 처리하죠. 

완료시는 COMMIT 처리합니다.

 


by jkson [2017.09.07 16:00:47]

모든 트랜잭션에는 commit or rollback이 수반되어야합니다.

데이터 변경이 없다하여 commit or rollback을 하지 않으면

데이터상에는 lock이 걸리지 않지만

테이블에 TM lock이 걸려 해당 lock을 처리하기 전까지

테이블 변경(컬럼 추가 등)이 불가합니다.

어플리케이션단에 쿼리 실행 후 오류 여부에 따라 commit 혹은 rollback 처리 로직을 꼭 넣어주셔야합니다.


by 코리아 [2017.09.07 16:09:37]

jkson, 우리집아찌님 답변 감사드립니다~ 어플리케이션단에서 commit, rollback 처리 로직을 넣어야겠네요...

그런데 ORA-00001: unique constraint  에러때문에 Table lock이 발생 될 수 있는건가요? 

ORA-00001 에러코드는 종종봤는데 해당 에러때문에 Table lock 현상이 발생 된건 처음이라서요


by 우리집아찌 [2017.09.07 16:11:53]

http://www.dator.co.kr/57003


by jkson [2017.09.07 16:17:05]

JDBC에서 commit, rollback 처리를 따로 하지 않으셨다면 기본적으로 commit이라고 하네요.(정확한 건지는 모르겠습니다.)

setAutocommit(true/false) 여부에 따라서도 달라질 것 같은데 정확한 건 직접 테스트해보셔야겠어요.


by 코리아 [2017.09.07 16:41:46]

commit/rollback 처리로직을 넣는게 답일거 같네요~

답변 감사합니다~!! 

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