Inflearn brand logo image

인프런 커뮤니티 질문&답변

양현수님의 프로필 이미지
양현수

작성한 질문수

Oracle PL/SQL 딱 이만큼.. [개념+실전]

Exception - Predefined Exceptions & Block 단위 Exception

commit시점은 어떻게 되나요?

작성

·

48

1

PL/SQL 수행 중

1.커밋시점이 언제인지 궁금합니다. PL/SQL 모두 수행 후?

2.

대용량처리시 전체 쿼리 수행 후 커밋을 찍는게 나을지 아니면 for문 돌면서 중간중간 커밋을 찍는게 나을지

3.cursor로 중간에 insert중 에러났을 때 전체 롤빽이 되는것인지. 아니면 커밋을 찍지 않아도 자동으로 1000건정도 커밋이 되는것인지.

 

답변 3

0

IT늦공 김부장님의 프로필 이미지
IT늦공 김부장
지식공유자

안녕하세요.
질문의 내용이 정말 실무에서 발생하는거라 좀 긴 답변이 되겠지만 제 생각을 말씀 드려 봅니다.
(아래 AI도 정말 좋은 답변을 했네요.)

 

1.커밋시점이 언제인지 궁금합니다. PL/SQL 모두 수행 후?
-> 아주 특이한 경우가 아니라면 commit/rollback 의 시점은 전체 수행이 완료되고 진행해야 합니다. 당연하겠지만 데이타의 정합성 측면에서 아주 중요합니다.
ex) 누군가가 어떤 프로시저를 만들때 commit 을 마지막에 넣게된다면, 해당 프로시저를 호출해서 사용하는 다른 프로시저는 트랜잭션 처리에 큰 문제가 생기기 때문에 정말 아주 특이한 경우가 아니라면
호출하는 프로그램에서 트랜잭션 처리를 해야 합니다.

 

2.대용량처리시 전체 쿼리 수행 후 커밋을 찍는게 나을지 아니면 for문 돌면서 중간중간 커밋을 찍는게 나을지
-> 이부분이 실무에서도 상당히 케이스바이케이스 입니다.
프로시저에서 insert/update/delete 처리를 대량(대량의 정의도 애매한데, 제가 다루는 DB는 보통 10만건 정도로 생각합니다.)
만일 100 만건에 대한 처리를 하는 패키지(프로시저)를 생성해서 작업을 하게 되면 트랜잭션 처리가 끝날때까지 자원을 잡게되어 실제 문제가 발생하는 경우도 있습니다.
이럴때는 경우에 따라서 for 문 중간에 1만건씩 처리시마다 commit 처리를 하기도 합니다.
단, 오류가 발생하게 되면 큰 문제가 되기 때문에 오류가 발생하는 부분을 exception 처리로 log 를 남기거나, 별도 테이블에 값을 넣어서 오류를 확인하고 오류건만 처리하는 경우도 있습니다.
혹시 실무에서 DB를 만지시고 계신다면 어떤 상황에서는 전체 처리를 해야 하고 어떤 상황에서는 전체가 아니더라도 처리 되는 부분만 처리되도록 하는 상황을 이해하실거라 생각합니다.


3.cursor로 중간에 insert중 에러났을 때 전체 롤빽이 되는것인지. 아니면 커밋을 찍지 않아도 자동으로 1000건정도 커밋이 되는것인지.
-> 2번 답변을 참고하시구요
pl/sql 처리에서 자동 커밋이란 없다고 생각해야 합니다.
자동 커밋은 그 자체로 너무 위험하니까요. 실행하는 사람이 알지 못하는 상황에서 commit 이 되어 버린다면 데이타가 꼬이는 상황이 발생할 수 있습니다.
참고로, 오라클 DB는 자동으로 트랜잭션 처리를 하지 않습니다.
그래서, 툴을 사용하다보면 트랜잭션 처리를 하지 않고 시스템을 종료하려고 하면 commit/ rollback 을 하라는 메세지가 나옵니다.
따라서 PL/SQL 은 자동으로 commit / rollback 을 하지 않습니다.
insert 중간에 오류가 발생하게 된다면 반드시 exception 처리를 통해서 rollback 처리를 해야 합니다. 오라클DB를 다루는데 있어서 트랜잭션 처리는 정말 중요합니다.
잘못처리할 경우 lock 이 걸리면서 큰 장애를 발생시키기도 합니다.
그래서, 큰 기업의 경우 DBA를 별도로 두기도 합니다.

좋은 질문이어서 저도 답변이 좀 길어졌습니다.
제 답변이 부족했다면 추가 질문 주세요 ~

0

양현수님의 프로필 이미지
양현수
질문자

실무에서 대용량처리시 어떤 식으로 사용하나요? cursor로 for문 돌면서 중간중간 커밋을 하나요? 아니면 pl/sql끝날때 자동커밋되게 내비두나요~

ai답변중 3번이 좀 이해가 안되는데요~에러가 발생해도 롤백이 안되는게 이해가 안가는데 cursor 를 사용하면 커밋 자동으로 되고, 에러 발생시 자동으로 롤빽이 안되고 자동으로 롤빽이 되는 것 인가요?

IT늦공 김부장님의 프로필 이미지
IT늦공 김부장
지식공유자

우선 위에 2번 답변을 참고하시구요.

ai답변중 3번이 좀 이해가 안되는데요~에러가 발생해도 롤백이 안되는게 이해가 안가는데 cursor 를 사용하면 커밋 자동으로 되고, 에러 발생시 자동으로 롤빽이 안되고 자동으로 롤빽이 되는 것 인가요?
-> 이부분은 오라클 DB 를 이해해야 합니다.
만일 update 처리를 하는데 어떤 문제( 문법, 데이타)로 오류가 발생한다면 이부분은 트랜잭션이 처리된 영역이 아닙니다.
당연하게도 정상 처리 되었을때 commit / rollback 처리를 하게 되는 거죠.
rollback 은 오류가 발생했을때 처리하는 기능이 아니라 정상 처리 되었을때 이를 되돌리는 기능입니다.
따라서, 오류가 발생한다는건 사실 어떤 처리도 되지 않은 겁니다.

좀더 복잡한 상황을 만들어 본다면 for 커서를 사용해 100개 처리를 한다고 가정.
이때 99개까지는 정상으로 update 되고, 마지막 한개가 오류가 발생할 경우..
이때 99개는 정상으로 처리 되었기 때문에 commit/ rollback 처리를 해야 하며
마지막 한개의 오류는 오라클 내부적으로 처리하게 됩니다.

이런 이유로 여러개의 프로시저를 호출해서 사용할 경우 (실무에서는 10개 이상의 프로시저를 호출하는 경우도 발생합니다.) 트랜잭션 처리에 신경을 써야 하고 반드시 exception 처리를 통해서 오류발생 시 기본적으로 rollback 처리를 해야 합니다.

0

안녕하세요, 인프런 AI 인턴입니다. 양현수님.

질문하신 PL/SQL의 커밋 시점과 관련된 사항은 데이터베이스 트랜잭션 관리에서 중요한 부분을 차지합니다. 이를 알맞게 설정하는 것은 시스템의 성능과 데이터 정합성 유지에 큰 영향을 줍니다.

1. 커밋 시점

PL/SQL의 트랜잭션은 디폴트로 수동 커밋 모드입니다. 따라서, 모든 PL/SQL 블록이 완료될 때까지 자동으로 커밋되지 않습니다. 즉, 명시적으로 COMMIT 문을 작성해야 해당 트랜잭션이 커밋됩니다. 그렇지 않으면 트랜잭션은 여전히 열려있고, PL/SQL 블록이 끝나더라도 커밋되지 않습니다.

2. 대용량 처리 시의 커밋 전략

대용량 데이터를 처리할 때는 전체 작업이 완료된 후 커밋할지, 중간에 나누어서 커밋할지 선택해야 합니다.

  • 전체 완료 후 커밋: 데이터 정합성이 중요하며, 하나의 논리적인 작업으로 보고 싶다면 이 방식을 선택합니다. 그러나, 메모리 사용량 증가와 롤백시 장기간의 작업이 무효화될 수 있다는 단점이 있습니다.

  • 중간 중간 커밋: 시스템 자원의 부담을 덜 수 있고, 오류 발생 시 일부 커밋된 결과를 저장할 수 있습니다. 하지만, 데이터 정합성 측면에서 위험 요소가 있을 수 있습니다. 이를 위해서는 트랜잭션 경계와 예외 처리를 신중하게 설계해야 합니다.

3. 커서와 에러 발생 시 롤백

PL/SQL에서 커서를 사용하여 작업을 수행할 때, 에러가 발생하면 해당 트랜잭션은 롤백되지 않습니다. 명시적으로 ROLLBACK문을 사용해야 합니다. 자동 커밋(예: Autocommit)은 특정 SQL 인터페이스(환경)에서 따로 설정되어 있지 않으면 일반적으로 발생하지 않으므로, 커밋이 되지 않은 시점에서 에러가 발생하면 수작업으로 롤백해야 합니다.

이 정보를 기반으로, 트랜잭션 처리에 대한 전략을 수립하시면 좋을 것 같습니다.

다음 링크에서 유사한 실무 경험과 해결 방법에 대한 설명을 추가로 확인하실 수 있습니다:
- 트랜잭션 처리 관련 질문과 해결 방안
- 실무에서의 SQL 트랜잭션 관리

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

양현수님의 프로필 이미지
양현수

작성한 질문수

질문하기