[DB]Lock 이란?

2025. 6. 5. 17:52·SQL

데이터베이스 Lock에 대해 알아보고 체계적으로 정리해본다.

데이터베이스는 데이터를 영속적으로 저장하는 시스템으로, 여러 사용자가 동시에 같은 데이터에 접근할 때 데이터의 일관성과 무결성을 유지해야 한다.

예를 들어, 잔고가 5000원이 있을때 5000원 주문을 2개 동시에 수행했을 때 하나의 주문만 완료 되어야 한다. 이를 보장하기 위해 DBMS는 Lock 이라는 메커니즘을 사용한다.

 

✅ Lock이란?

  • Lock은 트랜잭션의 순차적 처리를 보장하는 방법이다.
  • 트랜잭션은 데이터베이스의 논리적 작업 단위로, 나누어질 수 없는 최소 단위다.
💡 DBMS 마다 Lock의 구현 방식과 세부 메커니즘이 다르므로, 사용하는 DBMS의 Lock 동작 방식을 이해하는 것이 중요

 

 

✅ Lock의 종류

📌 공유(Shared) Lock

  • 데이터를 읽을 때 사용한다.
  • 특징: 다른 공유 Lock과의 동시 접근이 가능하다. 즉, 여러 사용자가 동시에 데이터를 읽을 수 있다.
  • 제한: 공유 Lock이 설정된 데이터에 배타 Lock을 설정할 수 없다.

 

📌 배타(Exclusive) Lock

  • 데이터를 변경할 때 사용한다.
  • 특징: 트랜잭션이 완료될 때까지 유지되며, 다른 트랜잭션(읽기 포함)이 해당 데이터에 접근할 수 없다.
  • 제한: 이미 다른 트랜잭션이 Lock을 설정한 데이터에는 배타 Lock을 설정할 수 없다.

 

✅ Lock의 설정 범위(Level)

Lock은 적용 범위에 따라 아래와 같이 나뉜다.


범위 설명 사용 사례
데이터베이스 전체 데이터베이스를 Lock. 한 세션만 데이터 접근 가능. DB 버전 업그레이드, 주요 업데이트 시
파일 데이터베이스 파일(테이블, 행 등이 저장된 물리적 저장소)을 Lock. 잘 사용되지 않음
테이블 테이블 전체를 Lock. 테이블의 모든 행에 영향을 주는 변경에 유용. DDL(create, alter, drop 등) 작업, DDL Lock이라고도 함
페이지/블록 파일의 일부인 페이지나 블록을 Lock. 잘 사용되지 않음
컬럼 컬럼 단위로 Lock. 리소스 소모가 크며 지원하는 DBMS가 적음. 일반적으로 사용되지 않음
행(Row) 특정 행을 Lock. DML 작업에 가장 많이 사용. 가장 일반적인 Lock 방식

 

 

✅ 블로킹(Blocking)

  • Lock 간(배타-배타, 배타-공유) 경합으로 인해 특정 트랜잭션이 진행을 멈춘 상태를 말한다.
  • 공유 Lock끼리는 블로킹이 발생하지 않지만, 배타 Lock은 블로킹을 유발한다. 블로킹을 해소하려면 이전 트랜잭션이 완료(커밋 또는 롤백)되어야 한다.
  • 이후 트랜잭션은 이전 트랜잭션이 끝날 때까지 대기한다
  • 이런 경합은 성능에 부정적인 영향을 미치므로, 경합을 최소화해야 한다.

 

📌 블로킹 최소화를 위한 주의사항

  • 트랜잭션의 길이를 너무 길게 설정하지 않는다.
  • 같은 데이터를 갱신하는 트랜잭션이 동시에 실행되지 않도록 설계한다.
  • 트랜잭션 격리성 수준을 불필요하게 높게 설정하지 않는다.
  • 쿼리가 오랜 시간 Lock을 점유하지 않도록 튜닝한다.
  • DBMS에 따라 Lock 대기 시간을 설정할 수 있다.

 

✅ 교착상태(Deadlock)

  • 두 트랜잭션이 각각 Lock을 설정한 상태에서 서로의 Lock에 접근하려고 할 때, 양쪽 모두 영원히 진행하지 못하는 상태를 말한다.

 

예를 들어, game_master와 game_detail 테이블이 있다고 하자.

트랜잭션 A가 game_master의 5번 행을 수정한 뒤 , game_detail의 5번 행을 수정하려고 한다.

동시에 트랜잭션 B는 game_detail의 5번 행을 수정한 뒤 game_master의 5번 행을 수정하려고 한다.

 

이 경우:

  • 트랜잭션 A는 game_master의 5번 행에 배타 Lock을 설정.
  • 트랜잭션 B는 game_detail의 5번 행에 배타 Lock을 설정.
  • 트랜잭션 A는 game_detail의 5번 행 Lock을 시도, 트랜잭션 B는 game_master의 5번 행 Lock을 시도.
  • 이미 각 행은 상대 트랜잭션에 의해 Lock이 설정되어 있으므로, 양쪽 모두 대기하며 영원히 풀리지 않는다.

 

📌 교착상태 해결방법

  • DBMS는 교착상태를 감지하면 한 트랜잭션에 에러를 발생시켜 문제를 해결한다.
  • 교착상태를 줄이기 위해서는 테이블 접근 순서를 일정하게 유지하는 것이 중요하다.
  • 예를 들어, 항상 game_master를 먼저 업데이트한 후 game_detail을 업데이트하도록 규칙을 정한다.

'SQL' 카테고리의 다른 글

[QueryDSL] QueryDSL 쓸려면 제대로 알고 쓰자  (1) 2025.05.08
[DB] 트랜잭션  (3) 2025.05.01
[DB] H2 란?  (2) 2025.04.30
[SQL]UPPER/LOWER 대소문자 구분없이 Like 사용  (1) 2025.03.05
[SQL]CSV 파일을 이용해 데이터 가져오기(MY SQL)  (0) 2025.01.20
'SQL' 카테고리의 다른 글
  • [QueryDSL] QueryDSL 쓸려면 제대로 알고 쓰자
  • [DB] 트랜잭션
  • [DB] H2 란?
  • [SQL]UPPER/LOWER 대소문자 구분없이 Like 사용
코딩로봇
코딩로봇
금융 IT 개발자
  • 코딩로봇
    쟈니의 일지
    코딩로봇
  • 전체
    오늘
    어제
    • 분류 전체보기 (149) N
      • JavaScript (8)
      • SQL (11)
      • 코딩테스트 (30)
        • Java (15)
        • SQL (13)
      • Java (10)
      • 프로젝트 (29) N
        • 트러블슈팅 (10) N
        • 프로젝트 회고 (17) N
      • git,Github (2)
      • TIL (38)
      • Spring (19)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    java #arraylist #list #배열
    스파르타 코딩 #부트캠프 #첫ot
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코딩로봇
[DB]Lock 이란?
상단으로

티스토리툴바