개발/데이터베이스

[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을 보유하게 된다.