정리하고기록하자

SELECT ~~ FOR UPDATE 본문

Database - 데이터베이스 ( DB )

SELECT ~~ FOR UPDATE

정리하고기록하자 2023. 6. 13. 14:57
반응형
SELECT 
    A
FROM TABLE
FOR UPDATE

SELECT ~~ FOR UPDATE 는 

" 데이터를 수정하려고 SELECT 중이다~ 다른 사람들은 데이터에 손 대지 마라 "  라고 할 수 있다.

동시성 제어를 위해서 특정 데이터에 대해 LOCK을 거는 기능이다.

 


SELECT ~~ FOR UPDATE

  • 은행의 예금 및 통장의 잔액 변경의 일관성을 유지하려고 할 때,
  • 영화 및 공연장의 특정 좌성을 예약 하려고 할 때

여러 상황에도 사용이 되긴 하지만 예시로 기본 적으로 위에 두가지 경우에 주로 사용한다.


movie_num seat name
1 12 영화A
2 9 영화B

사용자 A // 사용자 B 가 동시에 '영화B'에 접글 하려고 한다.

사용자A사용자B동시에 데이터에 접근 하려고 할때 

사용자A가 잔여좌석 정보를 SELECT 하고 예매를 완료하면서 UPDATE를 하고

사용자B가 잔여좌석 정보를 SELECT 하고 예매를 완료하면서 UPDATE를 한다.

최초에 사용자A사용자B가 SELECT 할 때 잔여좌석 9를 얻기 때문에 예매 완료 하면서 1이 줄어든 8로 업데이트 한다.

결론적으로 두 명이 영화 예매를 했지만 잔여좌석은 1만 줄어든다.

 

SELECT ~~ FOR UPDATE로 처리 한 경우

사용자 A가 SELECT ~FOR UPDATE를 실행하고 잔여 좌석정보를

SELECT 한 경우 해당 ROW는

다른 세션들이 접근할 수 없게 LOCK이 걸린다.

 

사용자 B가 SELECT로 접근 하려고 해도

사용자 A가 LOCK을 가지고 있기 때문에

사용자 ALOCK을 풀어 줄대 까지 대기 상태이다. 

 

사용자 A가 잔여좌석 수를 UPDATE 한 경우

LOCK이 풀리고

사용자 B가 SELECT 및 UPDATE가 가능해 진다.


SELECT ~~ FOR UPDATE 옵션

  • SELECT ~~ FOR UPDATE : SELECT 할 때 LOCK 을 제어할 수 없다면 무한정 기다린다.
    ㄴ 즉, 누군가가 LOCK 중이면 무한정 내 차례를 기다린다.
  • SELECT ~~ FOR UPDATE NOWAIT : SELECT 할 때 LOCK을 제어할 수 없다면 에러처리한다.
    ㄴ 즉, 누군가가 LOCK 중이면 해당 행에 대한 LOCK을 바로 포기한다.
  • SELECT ~~ FOR UPDATE WAIT 5 : SELECT 할 때 LOCK을 제어할 수 없다면 5초 동안 계속 LOCK을 재시도한다.
    ㄴ 즉, 누군가가 LOCK 중이면 5초 동안 계속 재시도하고, 그 이후에 포기한다.
    WAIT 5(초단위) 초단위 변경 가능
반응형