728x90
SELECT ~ FOR UPDATE란
SELECT ~ FOR UPDATE 구문은 "데이터 수정하려고 SELECT 하는 중이야~ 다른 사람들은 데이터에 손 대지 마!" 라고 할 수 있습니다. 좀 더 딱딱한 표현으로는 동시성 제어를 위하여 특정 데이터(ROW)에 대해 베타적 LOCK을 거는 기능입니다.
예를 들어 정단 단순무식한 예로 영화관의 영화 예매 테이블이 있다고 가정합니다. 영알못이라 잔여 좌석을 seat로 표현하였습니다.
여기서 사용자 A와 사용자 B가 월E를 예매하려 동시에 데이터에 접근합니다. A가 잔여좌석 정보를 SELECT하고 예매를 완료하면서 잔여좌석은 1 줄어든 11로 UPDATE 하려합니다. 그런데 그 사이에 B 사용자 또한 예매를 위해 SELECT하였고 A와 마찬가지로 잔여좌석 12를 얻어 예매를 완료하면서 1 줄어든 11로 업데이트 합니다.
결론적으로는 두 명의 영화 예매가 진행되었지만 잔여좌석은 1만 줄어들게 되었습니다.
SELECT ~ FOR UPDATE로 처리
SELECT ~ FOR UPDATE를 실행하면 특정 세션이 데이터에 대해 수정을 할 때까지 LOCK이 걸려 다른 세션이 데이터에 접근할 수 없습니다.
이번에는 A 사용자가 SELECT ~ FOR UPDATE를 실행하여 잔여 좌석정보를 SELECT 했고 해당 ROW는 다른 세션들이 접근할 수 없는 LOCK이 걸립니다. 이때 B가 SELECT로 접근하려 해도 A가 LOCK을 가지고 있기에 A가 LOCK을 풀어줄 때까지 대기상태에 빠집니다.
이후 A가 잔여좌석 수를 UPDATE하면서 LOCK이 풀리고 B는 SELECT 및 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초 동안 계속 재시도하고, 그 이후에 포기한다.
728x90
반응형
'Oracle > SQL' 카테고리의 다른 글
[Oracle] ROLLUP (0) | 2024.08.19 |
---|---|
[Oracle]ORA-02185: a token other than WORK follows COMMIT (0) | 2024.07.05 |
[Oracle] EXECUTE IMMEDIATE 문 ( 동적 SQL) (0) | 2024.07.04 |
[SQL] 계층형 쿼리 ( CONNECT BY ) (0) | 2024.03.05 |
[SQL] 윈도우 함수(Window Function)의 종류(4)- 비율 관련 함수(CUME_DIST, PERCENT_RANK, NTILE, RATIO_TO_REPORT) (0) | 2023.04.18 |