데이터베이스

비관적 동시성 제어 (Pessimistic Concurrency Control) vs 낙관적 동시성 제어 (Optimistic Concurrency Control)

트랜잭션 동시성 제어 방식에는 크게 비관적 동시성 제어(Pessimistic Concurrency Control, PCC)와 낙관적 동시성 제어(Optimistic Concurrency Control, OCC) 두 가지가 있습니다. 각각의 방식은 동시성 문제를 해결하는 접근 방식이 다릅니다.

※ 참고로 금융권에서는 FOR UPDATE 구문을 당연하게 사용합니다. 다른 분야에서는 FOR UPDATE 구문을 꺼리는 경향이 있는데, “데이터의 변경”을 목적으로 SELECT를 하는 경우라면 저는 FOR UPDATE 구문을 당연히 사용해주는 것이 좋다고 봅니다. (대신 동시성을 위해 WAIT 옵션을 주의해서 사용)

📌 1. 비관적 동시성 제어 (Pessimistic Concurrency Control)

비관적 동시성 제어는 다른 트랜잭션이 데이터를 동시에 접근하면 충돌이 발생할 것이라고 가정하고, 미리 락(Lock)을 걸어 다른 트랜잭션의 접근을 차단하는 방식입니다.

🔹 동작 방식

  1. 트랜잭션이 시작될 때 락을 획득(읽기/쓰기 락)
  2. 트랜잭션이 완료될 때까지 다른 트랜잭션이 해당 데이터에 접근하지 못하도록 차단
  3. 트랜잭션이 끝나면 락을 해제

🔹 장점

✅ 동시성 문제(Dirty Read, Non-Repeatable Read, Phantom Read 등)를 효과적으로 방지
✅ 트랜잭션 충돌이 자주 발생하는 환경에서 안전한 데이터 처리 가능

🔹 단점

❌ 락이 오래 유지되면 다른 트랜잭션이 대기하면서 성능 저하 (병목 현상) 발생
❌ **교착 상태(Deadlock)**가 발생할 가능성이 있음
❌ 트랜잭션이 락을 잡고 있을 동안, 다른 트랜잭션은 대기해야 하므로 시스템 자원 낭비

🔹 사용 사례

  • 데이터 충돌이 자주 발생하는 시스템 (예: 은행 계좌 이체, 재고 관리)
  • 읽기보다 쓰기가 많은 환경
  • 데이터 정확성이 매우 중요한 경우 (예: 금융, 거래 시스템)

📌 2. 낙관적 동시성 제어 (Optimistic Concurrency Control)

낙관적 동시성 제어는 트랜잭션 간 충돌이 적을 것이라고 가정하고, 별도의 락을 걸지 않음. 대신 트랜잭션 종료 시점에서 충돌이 발생했는지 검사하고, 문제가 발생하면 롤백하는 방식입니다.

🔹 동작 방식

  1. 읽기(Read Phase): 데이터를 읽음 (락 없이 읽음)
  2. 검증(Validation Phase): 데이터 변경 전에 다른 트랜잭션이 같은 데이터를 수정했는지 확인
  3. 쓰기(Write Phase): 충돌이 없으면 데이터를 갱신하고 커밋, 충돌이 있으면 롤백 후 다시 시도

🔹 장점

✅ 락을 사용하지 않으므로 병목 현상이 적고, 시스템 성능이 향상됨
✅ 읽기 작업이 많은 시스템에서 효율적 (다중 사용자 환경에서 높은 동시성 제공)
✅ 교착 상태(Deadlock)가 발생하지 않음

🔹 단점

❌ 충돌이 발생하면 롤백이 많아지고 성능 저하 가능
❌ 트랜잭션이 길어질 경우, 롤백 비용이 커질 수 있음
❌ 충돌이 자주 발생하는 환경에서는 오히려 비관적 동시성 제어보다 비효율적

🔹 사용 사례

  • 읽기 작업이 많고, 쓰기 작업이 적은 환경 (예: 데이터 분석 시스템, 보고서 생성)
  • 대부분의 트랜잭션이 서로 충돌할 가능성이 낮은 경우
  • 분산 데이터베이스 환경 (예: 클라우드 기반 애플리케이션)

📊 3. 비관적 동시성 제어 vs 낙관적 동시성 제어 비교

비교 항목비관적 동시성 제어 (PCC)낙관적 동시성 제어 (OCC)
충돌 가정충돌이 자주 발생할 것으로 예상충돌이 드물다고 가정
락(Lock) 사용락을 사용하여 데이터 접근 제어락 없이 변경 충돌을 검증
성능동시성이 낮고, 트랜잭션이 오래 걸릴 수 있음동시성이 높고 빠름
충돌 발생 시충돌이 발생하지 않도록 예방충돌이 발생하면 롤백
장점데이터 일관성 보장, 동시성 문제 방지높은 성능, 교착 상태 없음
단점성능 저하, 교착 상태 발생 가능충돌 발생 시 롤백 비용 증가
적용 환경충돌이 빈번한 경우 (예: 금융, 재고 관리)읽기 위주 시스템, 충돌이 적은 경우

🔎 4. 언제 어떤 방식을 사용할까?

✅ 비관적 동시성 제어가 적합한 경우

  • 트랜잭션 충돌이 자주 발생하는 시스템 (예: 은행, 재고 관리)
  • 정확성이 중요한 시스템 (예: 송금, 예약 시스템)
  • 데이터가 자주 수정되는 경우 (쓰기 작업이 많음)

✅ 낙관적 동시성 제어가 적합한 경우

  • 읽기 작업이 많은 시스템 (예: 데이터 분석, 검색 엔진)
  • 충돌 가능성이 낮은 경우 (예: 사용자 프로필 업데이트, 로그 데이터 저장)
  • 고성능이 필요한 시스템 (예: 대량의 트랜잭션 처리)

🎯 5. 결론

비관적 동시성 제어는 충돌을 방지하는 방식, 낙관적 동시성 제어는 충돌을 허용하고 해결하는 방식입니다.

  • 비관적 동시성 제어는 정확성이 중요한 환경에서 강력한 동시성 제어를 제공하지만 성능이 낮을 수 있음.
  • 낙관적 동시성 제어는 높은 동시성을 보장하지만, 충돌이 많으면 성능이 저하될 수 있음.

환경과 트랜잭션 패턴을 고려하여 적절한 방식을 선택하는 것이 중요합니다! 🚀

zerg96

Recent Posts

서울 아파트값 88주째 상승인데 강남은 10주째 하락, 이게 동시에 가능한 이유

강남이 10주째 떨어지고 있다는 뉴스, 요즘 자주 보셨을 겁니다. 그러면 서울 집값이 꺾이는 중이냐 하면,…

3시간 ago

양자컴퓨터가 현실화되면 비트코인은 해킹당한다 — 암호화폐의 진짜 위기

양자컴퓨터가 현실화되면 비트코인의 암호화가 뚫릴 수 있습니다. 쇼어 알고리즘, NIST 대응 현황, 그리고 지금 당장…

3시간 ago

SQLD 핵심 개념, NULL·JOIN·윈도우 함수 8문제로 정리

SQLD에서 점수를 가르는 건 어려운 이론보다 NULL 처리, 조인 조건 위치, 윈도우 함수의 동작 같은…

8시간 ago

AI 때문에 디자이너 일자리 절반이 사라진다 — 지금 당장 바꿔야 할 것들

AI 이미지 생성 도구의 폭발적 보급으로 그래픽·콘텐츠 디자이너 일감이 실제로 줄고 있습니다. 어떤 직군이 먼저…

9시간 ago

전기차 소프트웨어 전쟁, 현대차가 테슬라를 이길 수 있을까

전기차 시장이 배터리 싸움에서 소프트웨어 전쟁으로 전환됐다. 테슬라의 AI·데이터 해자 vs 현대차의 SDV 전략, 진짜…

14시간 ago

미국 9월 생산자물가 1.3% 급등, 그런데 뉴욕증시는 올랐다: 10월 16일 간밤 시황

어제 미국에서 9월 생산자물가지수(PPI)가 나왔는데 숫자가 꽤 거칠었습니다. 그런데 간밤 뉴욕증시 3대 지수는 모두 올랐습니다.…

14시간 ago