본문 바로가기
DB/SQL튜닝

SQL튜닝이론 - 트랜잭션의 블로킹 해소를 위한 COMMIT

by 참외롭다 2024. 2. 11.
반응형

SQL튜닝이론 - 트랜잭션의 블로킹 해소를 위한 COMMIT

 

커밋은 트랜잭션으로 인해 발생한 블로킹을 해소하기 위해 사용됩니다. 블로킹은 선행 트랜잭션이 설정한 LOCK으로 인해 후행 트랜잭션이 작업을 진행하지 못하고 멈춰있는 상태를 말합니다. 커밋을 통해 이 상태를 해소합니다.

 

비슷하지만 다른 개념으로 교착상태가 있습니다. 교착상태는 두 트랜잭션이 각각의 리소스에 LOCK을 설정한 상태에서 반대 트랜잭션이 LOCK을 설정한 리소스에 LOCK을 설정하려고 진행하는 상황을 말합니다. 교착상태를 해소하기 위해서는 이를 먼저 인지한 트랜잭션이 문장 수준 롤백을 진행한 후 에러메시지를 던집니다. 즉, 교착상태를 유발한 문장 하나만 롤백합니다.

 

교착상태를 유발한 트랜잭션은 커밋 또는 롤백 해야합니다. 만약 전달받은 에러에 대해 예외처리 하지 않으면 대기 상태가 지속됩니다. 오라클에서 데이터를 읽을 때 LOCK을 사용하지 않기 때문에 다른 DBMS에 비해 LOCK 경합이 적게 발생합니다. 읽는 트랜잭션의 진행을 막는 부담이 없으므로 트랜잭션을 충분히 길게 가져갈 수 있습니다. 하지만 긴 트랜잭션은 지양해야 합니다.

 

반대로, 불필요하게 커밋을 너무 자주 수행하면 서버 프로세스가 LGWR에 로그 버퍼를 비우도록 요청하고 동기 방식으로 기다리는 횟수가 늘어나기 때문에 전체적인 속도가 느려집니다. 이는 오라클 10GR2 부터 제공하는 비동기 커밋과 배치 커밋을 활용해 해결할 수 있습니다.

 

- WAIT : LGWR 가 로그버퍼를 파일에 기록했다는 완료 메시지를 받을 때 까지 기다린다(동기식 커밋)

- NOWAIT : 완료 메시지를 기다리지 않고 바로 다음 트랜잭션을 진행한다(비동기식)

- IMMEDIATE : 커밋 명령을 받을 때마다 LGWR가 로그 버퍼 파일을 기록한다.\

- BATCH : 세션 내부에 트랜잭션 데이터를 일정량 버퍼링했다가 일괄처리한다.

 

이들 옵션을 조합해 아래 네 가지 커밋 명령을 사용할 수 있습니다.

 

COMMIT WRITE IMMEDIATE WAIT;
COMMIT WRITE IMMEDIATE NOWAIT;
COMMIT WRITE BATCH WAIT;
COMMIT WRITE BATCH NOWAIT;
반응형