일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- for
- C언어
- Scanner class
- 데이터
- IF
- java프로그래밍
- Spring
- 스캐너
- 배열
- 자바
- 함수
- error
- 백준
- 자료구조
- IFELSE
- 하드웨어
- MySQL
- FOR문
- 반복문
- 기본
- 유비쿼터스
- 백준알고리즘
- 알고리즘
- java
- 1차원배열
- 파이썬프로그래밍기초
- IF문
- 변수
- Scanner
- 스캐너클래스
- Today
- Total
정리하고기록하자
SELECT ~~ FOR UPDATE 본문
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을 가지고 있기 때문에
사용자 A가 LOCK을 풀어 줄대 까지 대기 상태이다.
사용자 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(초단위) 초단위 변경 가능
'Database - 데이터베이스 ( DB )' 카테고리의 다른 글
Data too long for column '' at row 1 - mysql (2) | 2023.06.20 |
---|---|
invalid comparison: java.util.ArrayList and java.lang.String (0) | 2022.10.06 |
TIMESTAMPDIFF 날짜 차이 가져오기 - mysql (0) | 2022.09.19 |
DB Clustering & Replication (0) | 2022.07.02 |
SQL (0) | 2022.06.24 |