본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
데이터베이스 병행제어를 위해 트랜잭션이 접근하고자 하는데이터를 잠그어 다른 트랜잭션이 접근하지 못하도록 하는 기법
  • 트랜잭션이 어떤 데이터에 접근하고자 할 때 로킹 수행
  • 로킹이 되어 있는 데이터에는 다른 트랜잭션이 접근할 수 없음
  • 트랜잭션은 로킹이 된 데이터에 대해서만 연산 수행
  • 로킹 단위:
로킹 단위 로크의 수 병행 제어 로킹 오버헤드 병행성 수준
커짐 적어짐 단순해짐 감소 낮아짐
작아짐 많아짐 복잡해짐 증가 높아짐
  • 필드, 레코드, 테이블, 파일, 데이터베이스 모두 로킹 단위가 될 수 있음
  • 락 에스컬레이션
    • 관리할 로킹 리소스에 따라 로킹 범위를 동적으로 변화시킴

전용 로크와 공용 로크

편집 원본 편집
  • 전용 로크(Exclusive Lock)
    • 트랜잭션 T1이 데이터에 전용 로크를 설정하면, T1만 읽기, 쓰기 가능
  • 공용 로크(Shared Lock)
    • 트랜잭션 T1이 데이터에 공용 로크를 설정하면, T1은 읽기만 가능, 쓰기는 불가능
    • T1이 로크를 걸어 둔 상태에서도 T2가 공용 로크 설정 가능
    • 즉 여러 트랜잭션에서 동시에 읽기 가능, 쓰기 불가
  • 블로킹(Blocking)
    • 로킹으로 인해 특정 세션이 작업을 진행하지 못하는 상태
    • 로킹 중인 트랜잭션이 commit 또는 rollback 됨으로써 해제
    • 해결 방안: 잦은 블로킹으로 인한 효율 하락을 막기 위해 트랜잭션을 최대한 짧게 설계할 필요
  • 교착상태(Deadlock)
    • 두 세션이 각각 Lock을 설정한 리소스를 기다리고 있는 상태(블로킹이 해제되지 않음)
    • DBMS가 임의로 한 세션을 kill 해야 해제 가능
    • DBMS 는 대기 그래프로 교착상태를 찾으면 관련 트랜잭션 가운데 하나를 희생자로 골라 철회(ROLLBACK)시켜 그 트랜잭션의 로크를 풀고, 나머지가 진행하게 한다. 희생된 트랜잭션은 처음부터 다시 실행한다
    • COMMIT 은 트랜잭션을 정상적으로 끝내는 명령이다. 서로를 기다리는 트랜잭션은 COMMIT 까지 가지 못하므로 COMMIT 으로 교착상태를 풀 수는 없다
    • 미리 막는 방법으로 타임스탬프에 따라 기다릴지 철회할지 정하는 wait-die·wound-wait 기법이 있다
직렬가능성을 보장할 수 있는 가장 널리 사용되는 로킹 기법
  • 교착상태 발생 가능성이 있음
  • 로크를 쓰기만 해서는 직렬가능성이 보장되지 않는다. 데이터를 다 쓰자마자 로크를 풀면 다른 트랜잭션이 그 사이에 끼어들어 직렬 스케줄과 다른 결과가 날 수 있다. 모든 로크 획득이 첫 해제보다 앞서는 2단계 로킹을 지켜야 직렬가능성이 보장된다
  • 배타 로크를 트랜잭션이 완료(COMMIT)되거나 철회(ROLLBACK)될 때까지 쥐고 있는 엄격한(strict) 2단계 로킹은 연쇄 복귀(cascading rollback)를 막는다 → 데이터베이스 병행제어

다중 단위 로킹

편집 원본 편집

로킹 단위를 하나로 정하지 않고 데이터베이스·테이블·페이지·레코드를 계층으로 보아 트랜잭션마다 알맞은 단위에 로크를 거는 방식이다. 하위 단위에 로크를 걸 때는 상위 단위에 IS·IX·SIX 같은 의도 로크를 먼저 걸어, 상위 단위에서 충돌을 바로 알 수 있게 한다. 로크 모드와 양립성 행렬은 다중 단위 로킹 문서에 있다.