Daily Dev Q&A: 데이터베이스 락

2026. 2. 2. 09:29·Archive/Daily Dev Q&A

Topic (오늘의 주제)

데이터베이스 락 (Database Lock)

Why (왜 사용하는가? 왜 중요한가?)

  • 실무: 여러 사용자가 동시에 같은 데이터를 수정하려 할 때, 데이터가 꼬이거나 유실되는 것을 막기 위한 최소한의 안전장치입니다. (예: 수강 신청 시 정원 초과 방지)
  • 구조적 의미: 트랜잭션의 ACID 속성 중 **격리성(Isolation)**을 보장하기 위한 핵심 메커니즘입니다. 하지만 락을 너무 강하게 걸면 성능이 떨어지고, 너무 약하게 걸면 데이터 정합성이 깨지는 Trade-off가 존재합니다.
  • 면접 의도: 동시성 제어의 기본 원리를 아는지, 그리고 데드락(Deadlock) 상황을 어떻게 예방하고 해결할 수 있는지 확인합니다.

Core Concept (핵심 개념 정리)

락은 "내가 이 데이터를 쓰고 있으니 건드리지 마"라고 표시하는 것입니다. 크게 락의 **종류(모드)**와 **범위(단위)**로 나뉩니다.

구분 종류 설명 특징
모드 (Mode) 공유 락 (Shared Lock, S-Lock) 데이터를 읽을 때(Read) 사용. 다른 사용자가 읽는 건 허용하지만, 수정은 불가. (읽기-읽기 호환 O)
  배타 락 (Exclusive Lock, X-Lock) 데이터를 변경할 때(Write) 사용. 다른 사용자가 읽지도, 쓰지도 못하게 막음. (완전 독점)
범위 (Scope) 테이블 락 (Table Lock) 테이블 전체를 잠금. 설정이 쉽지만, 다른 사용자가 아예 테이블을 못 써서 동시성이 매우 낮음.
  레코드 락 (Row Lock) 변경하려는 **특정 행(Row)**만 잠금. 정밀하게 제어 가능하여 동시성이 높지만, 관리가 복잡하고 리소스를 더 씀.

락의 호환성 (Compatibility)

  • Shared + Shared: 가능 (여러 명이 동시에 책 읽기 가능)
  • Shared + Exclusive: 대기 (누가 읽고 있으면 못 고침)
  • Exclusive + Exclusive: 대기 (누가 고치고 있으면 나도 못 고침)

Interview Answer Version (면접 답변식 요약)

"데이터베이스 락은 다중 사용자 환경에서 데이터의 일관성과 무결성을 유지하기 위해 사용되는 기술입니다.

크게 데이터를 읽을 때 사용하는 **공유 락(Shared Lock)**과 데이터를 변경할 때 사용하는 **배타 락(Exclusive Lock)**이 있습니다. 공유 락끼리는 동시에 접근이 가능하지만, 배타 락은 다른 락과 호환되지 않아 대기가 발생합니다.

실무에서는 주로 동시성을 높이기 위해 테이블 전체가 아닌 특정 행만 잠그는 Row Level Locking을 주로 사용합니다."

Practical Tip (사용시 주의할 점 or 활용 예)

1. 데드락 (Deadlock, 교착 상태)

  • 상황: 트랜잭션 A는 자원 1을 잡고 2를 원하고, 트랜잭션 B는 자원 2를 잡고 1을 원해서 서로 무한히 기다리는 상태.
  • 해결:
    • 순서 통일: 모든 트랜잭션이 자원에 접근하는 순서를 동일하게 맞춥니다. (예: 항상 테이블 A → 테이블 B 순서로 접근)
    • 타임아웃 설정: 일정 시간 락을 획득하지 못하면 에러를 뱉고 롤백되도록 설정합니다.

2. 락의 범위 최소화

  • 트랜잭션을 최대한 짧게 유지해야 합니다. 트랜잭션이 길어지면 락을 잡고 있는 시간이 길어져 다른 사용자들의 대기 시간이 늘어납니다. (DB 작업 외의 외부 API 호출이나 긴 연산은 트랜잭션 밖으로 빼야 함)

3. 인덱스와 락 (중요)

  • InnoDB(MySQL)의 경우, 레코드 락은 실제 데이터 레코드가 아니라 인덱스 레코드에 걸립니다.
  • UPDATE ... WHERE 절에 인덱스가 없는 컬럼을 사용하면, 대상을 찾기 위해 테이블을 풀 스캔하면서 모든 레코드에 락을 걸어버리는 참사가 발생할 수 있습니다.

예상 꼬리질문 정리

Q1. 데드락(Deadlock)이 발생했을 때 시스템은 어떻게 처리하나요?

  • 핵심 키워드: 대부분의 DBMS는 데드락 감지 기능이 있어, 데드락 상황을 감지하면 둘 중 트랜잭션 크기가 작거나 롤백 비용이 적은 트랜잭션을 강제로 종료(Rollback)시켜 교착 상태를 풉니다.

Q2. 비관적 락(Pessimistic Lock)과 낙관적 락(Optimistic Lock)의 차이는 무엇인가요?

  • 핵심 키워드: 비관적 락은 "충돌이 날 것이다"라고 가정하고 DB의 락 기능을 이용해 대기시키는 방식(안전함, 느림)이고, 낙관적 락은 "충돌이 안 날 것이다"라고 가정하고 락 대신 버전(Version) 정보를 이용해 나중에 충돌을 확인하는 애플리케이션 레벨의 방식(빠름, 롤백 처리 필요)입니다.

Q3. 분산 환경(MSA)에서 데이터베이스가 서로 다를 때 락은 어떻게 관리하나요?

  • 핵심 키워드: DB 자체 락으로는 해결이 불가능하므로, Redis나 ZooKeeper 같은 외부 저장소를 이용한 **분산 락(Distributed Lock)**을 사용하여 동시성을 제어해야 합니다. (예: Redis의 Redisson 라이브러리 사용)

'Archive > Daily Dev Q&A' 카테고리의 다른 글

Daily Dev Q&A: Spring AOP  (0) 2026.02.23
Daily Dev Q&A: 트랜잭션 격리 수준  (0) 2026.02.02
Daily Dev Q&A: 데이터베이스 동시성 이슈  (0) 2026.01.29
Daily Dev Q&A: 트랜잭션과 인덱스의 관계  (0) 2026.01.29
Daily Dev Q&A: 관계형 데이터베이스의 인덱스  (1) 2026.01.27
'Archive/Daily Dev Q&A' 카테고리의 다른 글
  • Daily Dev Q&A: Spring AOP
  • Daily Dev Q&A: 트랜잭션 격리 수준
  • Daily Dev Q&A: 데이터베이스 동시성 이슈
  • Daily Dev Q&A: 트랜잭션과 인덱스의 관계
tlsgkstj
tlsgkstj
짱구의 성장 일기
  • tlsgkstj
    코딩하는 짱구
    tlsgkstj
  • 전체
    오늘
    어제
    • 분류 전체보기 (159)
      • About (1)
      • Projects (35)
        • Personal Projects (21)
        • Team Projects (14)
      • Engineering (20)
        • CS & Tools (0)
        • Backend Core (15)
        • Frontend (1)
        • Infra & Cloud (2)
        • AI & Tools (1)
      • Trouble Shooting & Issues (0)
      • Growth & Career (38)
        • Interview Prep (0)
        • Retrospectives (38)
      • Archive (65)
        • TIL (8)
        • Daily Dev Q&A (56)
  • 블로그 메뉴

    • 홈
    • About
    • Projects
    • Tech Stack
    • Dev Log
    • GitHub
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    java
    커리어리셋
    devlog
    OrphanRemova
    클로드코드
    SpringBoot
    til
    Project_Review
    jpa
    backend
    DevFestIncheon2025
    데브페스트
    프로덕트개발자
    spring
    REACT
    aws_s3
    경기기후바이브코딩
    network
    프로젝트회고
    Spring비교
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
tlsgkstj
Daily Dev Q&A: 데이터베이스 락
상단으로

티스토리툴바