-
[Oracle] Lock에 대한 정리개발/데이터베이스 2022. 1. 10. 00:11
Lock이란
트랜잭션 처리의 순차성을 보장하기 위한 방법입니다.
DBMS마다 Lock을 구현하는 방식과 세부적인 방법이 다르기 때문에 사용하는 DB의 Lock에 대한 이해가 필요합니다.Lock의 특징
- 다중 세션에서 동일한 데이터를 동시에 변경하는 것을 방지합니다.
- 세션이 데이터를 수정할 수 있도록 하려면 먼저 수정하고 있는 데이터를 lock 해야한다.
- 주어진 명령문을 통해 가능한 가장 낮은 레벨에서 자동으로 획득됩니다.
- escalate하지 않는다.
- 수동 및 자동 Lock을 모두 지원한다.
Lock 충돌 유발 원인
- 커밋되지 않은 변경 사항
- 장기 실행 트랜잭션
- 필요 이상으로 높은 Lock 레벨
Lock 충돌 해결
- lock을 보유하는 세션을 커밋 또는 롤백한다.
- lock을 보유하는 세션을 종료한다.(응급 상황)
Lock의 메커니즘
- 높은 레벨의 데이터 동시성:
- 삽입, 갱신 및 삭제에 대한 행 레벨 Lock
- Query 에 lock이 필요 없음 - 자동 큐 관리
- 트랜잭션이 종료될 때까지 Lock 보유(커밋 또는 롤백 작업 사용)
Lock 모드의 종류
- ROW SHARE : Lock된 테이블에 대한 동시 액세스를 허용하지만 세션이 배타적 액세스를 위해 전체 테이블을 lock 하는 것은 금지한다.
- ROW EXCLUSIVE : ROW SHARE와 동일하지만 SHARE 모드에서도 lock하는 것을 금지한다.
ROW EXCLUSIVE lock은 데이터 갱신, 삽입 또는 삭제시 자동으로 획득된다. 그리고 사용하게 되면 여러 번 읽을 수 있고 한 번 쓸 수 있다. - SHARE : 동시 query는 허용하지만 Lock된 테이블에 대한 갱신은 금지한다.
테이블에서 인덱스를 생성하려면 SHARE Lock이 필요하며 자동으로 요청된다. 그러나 온라인 인덱스를 생성하려면 인덱스를 작성할 때 ROW SHARE Lock을 사용해야 한다. - SHARE ROW EXCLUSIVE : 전체 테이블을 Query하는 데 사용되며 다른 유저가 테이블의 행을 Query하는 것은 허용하지만 해당 테이블을 SHARE 모드에서 lock하거나 행을 갱신하는 것은 금지한다.
- EXCLUSIVE : lock된 테이블에서의 query는 허용하지만 해당 테이블에서의 다른 작업은 금지한다. 테이블을 삭제하려면 EXCLUSIVE lock이 필요하다.
Enqueue 메커니즘
Enqueue 메커니즘을 통해 다음을 추적할 수 있다.
- lock을 대기하는 세션
- 요청된 lock 모드
- 세션에서 lock을 요청하는 순서
Lock을 보유하는 트랜잭션이 완료되면 대기 중인 다음 세션이 Lock을 보유하게 된다. '개발 > 데이터베이스' 카테고리의 다른 글
[Oracle] Select 튜닝 순서 (0) 2022.01.24 [Oracle] RMAN (0) 2022.01.17 [Oracle] Undo(언두)란 (0) 2022.01.03 [데이터베이스] 집합연산자 정리 (0) 2021.12.16 [데이터베이스] 시퀀스 정리 (1) 2021.12.05