728x90
1. 개념
1.1 DB Lock 이란?
- DB Lock은 여러
트랜잭션
이 동시에 같은 자원에 접근할 때 데이터 무결성(정합성)을 보장하기 위해 사용되는 메커니즘 - 쉽게 말해, 어떤 사용자가 데이터를 사용하고 있는 동안에는 다른 사용자가 그 데이터를 동시에 수정하면 안 되기 때문에, ‘잠금’을 걸어서 충돌(Conflict)을 방지
1.2 왜 Lock이 필요한가?
- 여러 사용자가 동시에 DB를 사용하는 경우 같은 데이터를 동시에 수정하려고 시도하는 경우 충돌 제어 및 데이터의 일관성을 보장하기 위해
1.3 언제 Lock을 사용하는가?
- 사용해야 하는 경우!
- 동시에 읽기/쓰기가 빈번하게 일어나는 중요한 테이블에 대해, 데이터 무결성을 엄격히 보장해야 할 때.
- 은행 이체, 재고 관리, 주문 처리와 같이 동시에 발생하면 안 되는 시나리오를 제어할 때.
- 주의해야할 점!
- 불필요한 락은 성능 저하를 유발할 수 있으므로, 적절한 수준에서 사용하는 것이 중요
- DeadLock!!
- DeadLock발생 여부를 꼭 확인해야함!
1.4 Lock의 생명주기
1.4.1 트랜잭션 시작!
- DB와의 트랜잭션을 시작
- 아직 특정 자원에 대한 락이 획득된 상태는 🙅
1.4.2 Lock 획득
- 쿼리 요청
Lock
체크- 대기 혹은 Lock 획득
1.4.3 트랜잭션 종료
- 트랜잭션 커밋 혹은 롤백
- 락 해제
2. Lock 종류
2.1 낙관적 락 (충돌이 발생하지 않을 것이라고 가정)
- 데이터베이스의 락을 사용하는 것이 아닌
application
레벨에서 버전 관리 - 특정 작업을 수행하기 전에 별도의 락(lock)을 걸지 않고, 작업 완료 시점에서 데이터의 변경 여부를 확인하여 충돌 여부를 판단 (
@Version
활용) - 데이터 충돌이 거의 없을것이라고 가정한 경우 사용
LockModeType.OPTIMISTIC
로 적용
- 충돌 시
ObjectOptimisticLockingFailureException
발생
2.2 비관적 락 (충돌이 자주 발생할 것이라고 가정)
2.2.1 공유락(Shared Lock, S Lock)
- 여러 트랜잭션이 동시에 데이터를 읽기할 수 있지만, 쓰기 하려면 공유락을 해제하고 배타락으로 변경
- 다른 트랜잭션이 쓰기하려 하면 대기 상태
LockModeType.PESSIMISTIC_READ
로 적용
2.2.2 배타락(Exclusive Lock, X Lock)
- 오직 한 트랜잭션만 해당 데이터를 읽거나 쓸 수 있음
- 다른 트랜잭션이 접근하려 하면 대기 상태
LockModeType.PESSIMISTIC_WRITE
로 적용
2.3 분산 락
- 여러 인스턴스나 분산 환경에서 락을 설정
- 데이터베이스에 직접 Lock을 걸지 않고, 외부에서 권한을 받아 처리
Redis, **Zookeeper 등...
을 활용하여 적용**
반응형
'Study > Spring' 카테고리의 다른 글
[Spring] Spring Security + OAuth 2.0 소셜 로그인 (1) | 2025.01.16 |
---|---|
[Spring] QueryDSL-JPA (0) | 2024.12.30 |
[Spring] @InitBinder (0) | 2021.08.08 |
[Spring] @Data 어노테이션 (0) | 2021.06.30 |
[Spring] 영속성 컨텍스트 (Persistence Context) (0) | 2021.06.30 |