본문 바로가기

데이터베이스/ORACLE

[ORACLE] SELECT ~ FOR UPDATE 기능 및 용도

SELECT ~ FOR UPDATE 정의

선택된 행들에 대해 배타적인 LOCK을 설정하는 기능이다. SELECT FOR UPDATE 문을 통해 커서 결과 집합의 레코드를 잠글 수 있다. 이 문을 사용하기 위해 레코드를 변경할 필요는 없다. (일반적인 SELECT 문장은 SHARED LOCK이다. 즉, 다른 사람도 동시에 접근할 수 있다.)

 

 

SELECT ~ FOR UPDATE 특징

- update, delete만 row level lock이 걸린다. (select, insert는 상관 없음?)

- 오라클에서 lock은 table 단위 lock이 아니라, 처리할 데이터 row 레벨 lock.

 

SELECT ~ FOR UPDATE 용도

- 은행의 예금 및 통장의 잔액 변경의 일관성을 유지하려고 할 때

- 영화 및 공연장의 특정 좌석을 예약하려고 할 때

 

'SELECT ~ FOR UPDATE' 사용하지 않을 때와의 비교

 

SELECT ~ FOR UPDATE 사용하지 않을 때 : 다른 세션에서 UPDATE 하고 있어도, 같은 행을 조회할 수 있다. COMMIT을 하기 전에는, 결과가 반영되지 않는다.

SELECT ~ FOR UPDATE 사용할 때 : 조회는 된다. 그러나 변경이 안 된다(SCRIPT RUNNER 작업이라고 뜸)

 

ROLLBACK으로 SELECT ~ FOR UPDATE 문을 끝내니, 바로 UPDATE 실행됨.

 

SELECT ~ FOR UPDATE 옵션

누군가가 LOCK을 걸고 있는 상황에서의 옵션 별 차이

 

1. SELECT FOR UPDATE: SELECT 할 때 LOCK을 제어할 수 없으면 무한정 기다린다. 즉, 누군가가 LOCK 중이면 무한정 내 차례를 기다린다.

 

2. SELECT FOR UPDATE NOWAIT: SELECT 할 때 LOCK을 제어할 수 없으면 에러처리한다. 즉, 누군가가 LOCK 중이면 해당 행에 대한 LOCK을 바로 포기한다.

 

3.SELECT FOR UPDATE WAIT 5(초단위): SELECT 할 때 LOCK을 제어할 수 없으면 5초 동안 계속 LOCK을 재시도한다. 즉, 누군가가 LOCK 중이면 5초 동안 계속 재시도하고, 그 이후에 포기한다.