본문 바로가기
CS/데이터베이스

Lock

by taeung515 2025. 6. 27.

< 문제 상황 >

Concurrency Issue - 동시성 이슈

여러 쓰레드(Thread)나 프로세스(Process)가 동시에 공유자원에 접근할 때 발생하는 모든 문제

 

Race Condition - 경합 조건

동시성 이슈중 한개

한개의 자원에 여러개의 쓰레드가 동시에 접근했을 때 실행 타이밍에 따라 결과가 달라지는 문제

 

< 해결책 >

Lock

  • 공유 자원에 대한 동시 접근을 제어하는 매커니즘
  • 데이터 무결성을 보장해준다

 

 

Shared Lock(공유락) vs Exclusive Lock(배타락)

Shared Lock, S-Lock

  • 동일한 데이터를 여러 트랜잭션이 동시에 읽는것은 허용, 쓰기 불가
  • Serializable과 같은 높은 격리수준에서는 일반 Select문에서 S-Lock 획득
// 명시적 S-Lock 획득
SELECT * FROM account WHERE id=1 FOR SHARE;

Exclusive Lock, X-Lock

  • 데이터 쓰기시 다른 트랜잭션이 데이터를 읽기/쓰기 불가
  • 락을 획득한 트랜잭션만이 행/페이지/테이블에 대해 읽기/쓰기 가능
  • INSERT/UPDATE/DELETE 문 수행시 자동으로 X-Lock 획득
// 명시적 X-Lock 획득
SELECT * FROM account WHERE id=1 FOR UPDATE;

 


Pessimistic Lock(비관적 락) vs Optimistic Lock(낙관적 락)

Optimistic Lock

  • 트랜잭션이 진행되는 동안 “동시성 문제가 거의 발생하지 않는다” 는 철학을 가지고 충돌에 대한 검사를 나중으로 미루는 방법
  • Commit 시점에 Version을 검사하여 일치하지 않으면 롤백
  • 충돌이 많이 발생하는 환경에서는 롤백 오버헤드가 발생한다
UPDATE account SET 
balance = balance - 1000, 
version = version + 1 
WHERE id = 1 AND version = 6;

 

Pessimistic Lock

  • 트랜잭션이 진행되는 동안 “동시성 문제가 발생을 한다” 는 철학을 가지고 락을 거는 방법
  • X-Lock을 사용하여 다른 트랜잭션이 접근하지 못하게 막는다
  • 한번에 한개의 트랜잭션만 처리하기 때문에 API성능이 저하될 가능성이 있다

'CS > 데이터베이스' 카테고리의 다른 글

데이터베이스 동시성과 격리 수준  (0) 2025.06.27