< 문제 상황 >
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 |
|---|