DBLock, 블로킹, DeadLock

2025. 5. 2. 10:33·SQL/MySQL
반응형

DBLock

DB에 여러 트랜잭션이 동시에 동일한 데이터에 접근했을 때 정합성을 유지하고 충돌을 방지하여 순차적으로 처리될 수 있도록 지원하는 기능이다.

 

종류

  • 범위(Scope) 기준 (동시성 높은 순)
    • Row-Level Lock (행 락)
      • 레코드(row)에 락을 설정
      • 작은 범위의 락으로 동시성을 높일 수 있지만 오버헤드가 발생할 수 있다
    • Page-Level Lock (페이지 락)
      • 페이지(데이터 블록 단위)에 락을 설정
      • 페이지는 테이블을 구성하는 요소로 용량이 8kb로 제한되어 있다.
    • Table-Level Lock (테이블 락)
      • 테이블 전체에 락을 설정
      • 동시성은 낮지만 간단하고 빠르게 구현할 수 있다
    • Database-Level Lock (데이터베이스 락)
      • 데이터베이스 전체에 락을 설정
      • 주로 백업이나 복구 작업 등에서 사용된다.
  • 공유 여부 기준
    • Shared Lock (공유 락, S Lock)
      • 특정 데이터를 Read 할 때 주어지는 락으로 다른 트랜잭션이 동시에 Read 할 수 있다.
      • 특정 데이터에 S Lock이 걸려 있는 경우, Read는 가능하지만, Write는 불가능하다.
    • Exclusive Lock (배타 락, X Lock)
      • 특정 데이터를 Write 할 때 주어지는 락으로 다른 트랜잭션이 동시에 Read, Write 할 수 없다.
      • 특정 데이터에 X Lock이 걸려 있는 경우, Read, Write가 불가능하다.

 

블로킹

트랜잭션이 데이터에 접근하여 DBLock이 설정되었을 때, 경합이 발생하여 다른 트랜잭션이 대기하는 상황을 의미한다.

 

데드락(DeadLock, 교착 상태)

두 개 이상의 트랜잭션이 Lock이 설정된 서로의 데이터를 기다리며 무한정 멈추는(블로킹 상태) 상황을 의미한다.

 

MySQL, MariaDB의 InnoDB엔진은 데드락에 대해 자동으로 탐지하고 해결하는 기능을 갖고 있다. InnoDB엔진은 innodb_deadlock_detect설정이 기본 값(ON)으로 되어있어 데드락을 감지하고 트랜잭션을 롤백하여 데드락을 해결한다.

Error 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

 

해결방법

  • 필요한 데이터만 락이 설정되도록 작은 범위로 설정하고 락의 개수를 최소화 한다.
  • 트랜잭션의 자원 요청 순서를 일관되게 설정하고 타임아웃을 짧게 설정한다

 

낙관적 락(Optimistic Lock)

트랜잭션 충돌이 발생하지 않을 것이라 가정하고 락을 설정하는 방법이다. DB에서 지원하는 Lock 기능을 사용하지 않고, 애플리케이션 수준에서 Lock을 설정한다. JPA의 경우 @Version 어노테이션을 활용한 엔티티 버전 관리를 통해서 조회 시점과 업데이트 시점이 다른 경우 예외를 발생시킨다. 충돌 빈도가 적고, 서비스의 성능이 중요한 서비스에서 사용된다.

 

비관적 락(Pessimistic Lock)

트랜잭션 충돌이 발생할 것이라 가정하고 락을 설정하는 방법이다. DB에서 지원하는 Lock 기능을 사용한다. 데이터에 먼저 Lock을 걸어 데이터의 충돌을 예방할 수 있다. 속도 및 성능 보단 데이터의 일관성과 정합성이 중요한 서비스에서 사용된다.

반응형
저작자표시 비영리 변경금지 (새창열림)

'SQL > MySQL' 카테고리의 다른 글

프로그래머스 Lv.5 - 멸종위기의 대장균 찾기  (0) 2024.07.01
프로그래머스 Lv.4 - 연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기  (0) 2024.07.01
MySQL CTE(Common Table Expression) 공통 테이블 표현식  (0) 2022.09.16
'SQL/MySQL' 카테고리의 다른 글
  • 프로그래머스 Lv.5 - 멸종위기의 대장균 찾기
  • 프로그래머스 Lv.4 - 연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기
  • MySQL CTE(Common Table Expression) 공통 테이블 표현식
helperwoo
helperwoo
\ೕ( ・ㅂ・)و /
  • helperwoo
    WooLog
    helperwoo
  • 전체
    오늘
    어제
    • All (55)
      • Web (25)
        • PHP (6)
        • Java (5)
        • Javascript (8)
        • Laravel (2)
        • Spring Boot (0)
        • React.js (1)
        • Electron.js (1)
        • Vue.js (1)
        • Nest.js (1)
      • Mobile (2)
        • Flutter (2)
      • SQL (1)
        • MySQL (4)
      • Docker (6)
      • Server (7)
      • Git (2)
      • Tool (3)
      • AI (2)
      • Tip (3)
      • Log (0)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      CTE
      websocket
      docker
      recursive
      Compose
      프로그래머스
      image
      git
      CLI
      JavaScript
      ollama
      데이터베이스
      알고리즘
      frankenphp
      http
      MYSQL
      엘리스
      ignorecase
      nginx
      Laravel
      dart
      flutter
      deepseek
      챌린지
      vscode
      apache
      php
      DB연동
      코드
      with
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    helperwoo
    DBLock, 블로킹, DeadLock
    상단으로

    티스토리툴바