1일 1CS(Computer Science)

공유 락과 배타 락에 대해서 설명해주세요.

표자 2025. 4. 21. 09:44

🔐 DB 락(Lock)이 뭐예요? 공유 락 vs 배타 락, 그리고 데드 락까지!

안녕하세요 백엔드 개발자 여러분! 👩‍💻
오늘은 DB에서 데이터 무결성과 안전한 병행 처리를 위해 꼭 알아야 할
락(Lock)에 대해 쉽게 알아볼게요!


🧩 락이 필요한 이유는?

여러 트랜잭션이 동시에 데이터에 접근할 때,
충돌이 생기지 않게 보호하는 장치가 바로 "락(lock)"입니다! 🔒


✅ 공유 락(Shared Lock) 🧍‍♀️🧍‍♂️

"읽기는 여러 명이 동시에 해도 돼~ 하지만 누가 수정하면 안 돼!"

  • 데이터를 읽는(SELECT) 트랜잭션들이 같이 공유할 수 있어요.
  • 하지만 누군가 수정(UPDATE/DELETE) 하려고 하면 ❌ 못 해요!

📘 예시

-- 공유 락: 여러 트랜잭션이 동시에 읽을 수 있음
SELECT * FROM users WHERE id = 1 FOR SHARE;

📌 이 데이터는 여러 트랜잭션이 읽기만 가능하고, 수정은 대기해야 해요.


🔒 배타 락(Exclusive Lock) 🧍‍♂️🚫

"내가 먼저 잡았어! 아무도 못 건드려~"

  • 수정, 삭제 같은 쓰기 작업을 하려면 배타 락이 필요해요.
  • 락이 걸린 동안엔 읽기조차 대기해야 할 수도 있어요!

📘 예시

-- 배타 락: 나만 쓸게. 아무도 건들지 마~
SELECT * FROM users WHERE id = 1 FOR UPDATE;

📌 이 데이터는 수정하기 전까지 다른 트랜잭션은 접근 불가! 😤


🧨 데드 락(Deadlock)이란?

"너가 놔야 내가 하지!"  "아냐, 네가 먼저 놔!" → 둘 다 멈춤 😵‍💫

🤯 데드 락 상황 예시

  • 트랜잭션 A: 1번 데이터 → 2번 데이터 수정
  • 트랜잭션 B: 2번 데이터 → 1번 데이터 수정

각각 먼저 락을 걸고, 서로가 가진 락을 기다리면 ❗무한 대기 상태!


✅ 데드 락 해결법은?

1. 락 순서 일관성 유지

-- 항상 같은 순서로 접근: id 1 → id 2

모든 트랜잭션이 같은 순서로 락을 걸면 교착 상태 방지!

2. 락 타임아웃 설정

-- PostgreSQL 예시
SET lock_timeout = '5s';

👉 일정 시간 지나면 포기하고 에러 발생 → 무한 대기 방지


🎯 요약 정리

종류 특징 예시 SQL

공유 락 여러 트랜잭션이 읽기 가능 FOR SHARE
배타 락 나만 읽고 쓸 수 있음 FOR UPDATE
데드 락 서로 락을 기다리며 멈춤 락 순서 지키거나, 타임아웃 설정 필요

 

 

 

공유 락과 배타 락에 대해서 설명해주세요.

DBMS에서 트랜잭션을 특별한 제어 없이 병행 수행을 허용한다면 데이터의 일관성과 무결성을 보장하기 어려울 수 있습니다. 이때, 병행 수행되는 트랜잭션들을 제어하기 위해서 락을 사용할 수 있으며 DBMS에서 락은 크게 공유 락과 배타 락으로 분류할 수 있습니다.

공유 락(Shared Lock) 읽기 락(Read Lock)이라고 부르며, 공유 락이 걸린 데이터에 대해서 다른 트랜잭션에서도 공유 락을 획득할 수 있지만, 배타 락은 획득할 수 없습니다. 즉, 공유 락을 사용하면 트랜잭션 내에서 조회한 데이터가 변경되지 않는다는 것을 보장합니다.

SELECT * FROM table_name WHERE id = 1 FOR SHARE;

배타 락(Exclusive Lock) 쓰기 락(Write Lock)이라고 부르며, 배타 락이 걸린 데이터에 대해서 다른 트랜잭션에서는 공유 락과 배타 락을 획득할 수 없습니다. 즉, 배타 락을 획득한 트랜잭션은 데이터에 대한 독점권을 가집니다.

SELECT * FROM table_name WHERE id = 1 FOR UPDATE;

정리하자면, 공유 락이 걸린 데이터는 다른 트랜잭션에서 공유 락을 획득 할 수 있고, 배타 락이 걸린 데이터는 다른 트랜잭션에서 어떤 종류의 락도 획득할 수 없어서 대기하는 상황이 발생할 수 있습니다.

 

데드 락은 언제 발생하며 어떻게 해결할 수 있나요? 🤔

데드 락(Dead Lock) 이란 교착 상태로, 두개 이상의 트랜잭션이 서로 필요로 하는 데이터의 락을 점유하고 있어서 무한히 대기하는 상황을 말합니다. 트랜잭션은 락을 획득하지 못하는 경우, 다른 트랜잭션이 점유하고 있는 락이 해제될 때까지 대기합니다. 예를 들어, 다음과 같은 트랜잭션들이 존재한다고 가정하겠습니다.

  • 트랜잭션 A, B가 있고 id가 1, 2인 데이터가 있는 상황에 두 트랜잭션이 시작합니다.
  • 트랜잭션 A는 id 1번을 읽고, 2번 데이터를 변경하는 트랜잭션입니다.
  • 트랜잭션 B는 id 2번을 읽고 1번을 변경하는 트랜잭션입니다.

이때 다음과 같은 상황에서 데드 락이 발생할 수 있습니다.

  • A는 1번, B는 2번 데이터에 대해 공유 락을 획득합니다.
  • A는 2번 데이터의 공유 락을 가지고 있는 B 트랜잭션이 락을 해제할 때까지 대기합니다.
  • B는 1번 데이터의 공유 락을 가지고 있는 A 트랜잭션이 락을 해제할 때까지 대기합니다.

데드 락을 해결하기 위해서 트랜잭션에서 락 획득 순서를 일관되게 할 수 있습니다. 모든 트랜잭션에서 1번 데이터, 2번 데이터 순으로 락을 획득할 시 데드 락이 발생하지 않습니다. 혹은 락 타임 아웃을 설정하여 데드 락 상황을 해결할 수 있습니다.

728x90