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가 가능해집니다.
'CS 잡지식' 카테고리의 다른 글
사용자 정의 인터페이스(feat. Spring Data JPA) (0) | 2023.05.12 |
---|---|
Dirty Checking의 치명적인 Weakness(단점)(feat. hint,lock) (1) | 2023.05.12 |
@EntityGraph(feat. Spring Data JPA가 제공하는 Fetch Join) (0) | 2023.05.12 |
Spring Data JPA가 제공하는 막강한 [페이징],[정렬] (1) | 2023.05.12 |
Paging에서의 offset과 limit의 정확한 의미!! (0) | 2023.05.11 |