SQL lock

mkhome·2021년 11월 30일
0

DB

목록 보기
4/4

Lock이란?

  • 데이터 일관성을 위한 방법(이름 그대로 lock, 잠금)
  • 유형
    1. Shared Lock : 다른 사용자가 읽는 것은 허용하지만 변경하는 것은 허용하지 않는다.
    2. Exclusive Lock : 다른 사용자가 읽고, 변경하는 모든 것을 허용하지 않는다. (Insert, Delete, Update)

Lock 단위

  • RID - 하나의 행
  • KEY - 인덱스가 있을 때 행
  • PAGE - 8KB 데이터 페이지 또는 인덱스 페이지
  • EXTENT - 인접한 8개의 데이터 페이지 또는 인덱스
  • TABLE - 데이터와 인덱스가 포함된 전체 테이블
  • 데이터와 인덱스가 포함된 전체 테이블
  • DB - 데이터베이스

Lock의 종류

  1. SHARED

    • 트랙잭션이 데이터를 읽기 동안에만 잠금

    • 공유 잠금을 사용시 여러 트랜잭션이 동시에 하나의 개체를 읽을 수 있다. (현재 운영, 개발서버)

    • 공유 잠금을 사용시 다른 트랜잭션이 데이터를 변경할 수 없다.

    • 다음 행을 읽을 때 현재 행의 공유 잠금을 해제한다.

    • 예외 사항

    1. 트랜잭션 고립수준이 REPEATABLE 이상
    2. LOCK HITN로 해당 공유잠금을 끝까지 유지
    3. SELECT * FROM EMP(HOLDLOCK)
  2. EXCLUSIVE(X)

    • 트랜잭션이 데이터를 변경할 때 단독 잠금
    • 단독잠금이 걸린 데이터는 다른 트랜잭션이 공유 잠금, 단독 잠금 또한 걸 수 없다.
    • 오직 하나의 트랜잭션만이 데이터에 대한 잠금을 걸 수 있다.
    • 예외사항
    1. 트랜잭션 격리 수준사용해서 단독 잠금 걸린 데이터를 다른 트랜잭션이 읽게 할 수 있다.
  3. UPDATE(U)

    • 트랜잭션이 변경할 데이터를 찾으면 거는 락
    • 나중에 데이터를 변경할 때 까지 데이터가 변경되지 않음을 확실하기 위해 건다.
    • 한번에 한 트랜잭션에만 업데이트 잠금을 얻을 수 있기 때문에 교착상태가 방지된다.
    • U잠금이 걸린 데이터에는 다른 트랜잭션이 U잠금을 걸 수 없지만, S 잠금은 걸 수 있다.
  4. INTENT(I)

    • 트랜잭션이 대상 데이터에 잠금을 걸 수 있을지 없을지를 신속히 판단할 수 있게 도와주는 잠금

BLOCKING

  • 블로킹은 Lock들의 경합으로 특정 세션이 작업을 진행하지 못하고 멈춰 선 상태를 의미
    해결하는 방법은 Transaction COMMIT, ROLLBACK

-> 결국 BLOCKING은 쿼리 하나하나가 길어질 경우에 일어날 확률이 높아지기에 SQL이 빠르게 실행되도록 리팩토링 하는 것이 효과적이다. = 트랜잭션을 짧게!, 동일한 데이터에 작업이 일어나지 않도록! 만약 일어난다면 lock_timeout을 설정하여 Lock의 최대 시간을 설정할 수 있음..

Dead Lock이란?

데드락은 트랜잭션간 교착상태를 의미하며 두 개의 트랜잭션간에 각각의 트랜잭션이 가지고 있는 리소스의 Lock을 획득하려할때 발생



대표적으로 두개의 예시가 있을 수 있음.

  • 최근에 프로시져(함수화)로 인해 길어진 것이 일수도

0개의 댓글