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초 동안 계속 재시도하고, 그 이후에 포기한다.
'데이터베이스 > ORACLE' 카테고리의 다른 글
[ORACLE] SQL 명령어 분류표 및 의미 (0) | 2020.06.01 |
---|---|
[ORACLE] Data Dictionary(System catalog) (0) | 2020.05.31 |
[ORACLE] 'GROUP BY 구 없이 그룹 함수가 내포되었습니다' 에러 (0) | 2020.05.29 |
[ORACLE] 부서별 컬럼을 만들고, 직원 수를 나타내기(GROUP BY or 조건문 활용) (0) | 2020.05.29 |
[ORACLE] 82년도에 입사한 직원 찾기(LIKE 활용) (0) | 2020.05.29 |