"여러 사용자 / 프로세스가 동시에 DB 에 접근하고 변경할 수 있다면??"
데이터의 일관성과 무결성이 보장되지 않을 것이다
이를 방지하기 위해 등장한 개념
데이터베이스 락 (Database Lock)
동시에 여러 사용자 혹은 프로세스가
DB 에 접근할 때 데이터의 일관성과 무결성을 유지하기 위해
데이터의 동시 수정을 제어하여 충돌을 방지하는 메커니즘
락의 주요 종류
공유 락(Shared Lock)
여러 트랜잭션이 동시에 데이터를 읽는 것을 허용한다
하지만 공유 락이 걸린 데이터를 다른 트랜잭션이 수정하는 것은 불가하다
주로 읽기 작업에 사용되며 여러 트랜잭션이 동시에 해당 데이터를 읽을 때 유용하다
트랜잭션 A 와 B 가 동일한 데이터에 접근하여 읽으려고 할 때
두 트랜잭션 모두 공유 락을 획득할 수 있다
배타 락(Exclusive Lock)
하나의 트랜잭션이 읽기와 쓰기 작업을 독점적으로 수행할 수 있도록 한다
베타 락이 걸린 경우, 다른 어떠한 트랜잭션은 접근이 불가하다
데이터의 수정이 포함된 작업에 주로 사용되며
데이터의 일관성과 무결성을 유지하는 데 필수적이다
행 레벨 락(Row Level Lock)
DB 테이블 개별 행에 락을 적용한다
고립성을 높이면서 동시성을 유지하는데 용이하며
필요한 최소한의 데이터에만 락을 적용하기 때문에
일부 데이터만을 대상으로 작업할 때 유용하다
특정 고객에 대한 데이터를 업데이트하는 경우
해당 고객의 행에만 락을 걸 수 있다
테이블 레벨 락(Table Level Lock)
DB 테이블 전체에 락을 적용한다
구현이 간단하지만 테이블의 규모가 클수록
성능 저하의 우려가 발생한다
주로 작은 테이블이나 간단한 트랜잭션에 사용된다
테이블의 모든 데이터를 업데이트하거나
새로운 데이터를 일괄적으로 삽입할 때 용이하다
옵티미스틱 락(Optimistic Lock)
데이터 충돌이 드물다고 가정하고
실제 업데이트 시점에만 데이터 충돌을 확인한다
동시성이 높은 환경에서
데이터 충돌 가능성이 낮다고 판단될 때 사용된다
페시미스틱 락(Pessimistic Lock)
옵티미스틱 락과 반대로
데이터 충돌이 자주 발생할 것으로 가정하고
데이터에 접근하기 전에 미리 락을 적용한다
여러 사용자가 동일한 데이터를 수정하려고 할 때처럼
동시성이 높고 데이터 충돌의 위험이 큰 환경에서 사용된다
LOCK 동작 방식
Lock 획득
트랜잭션이 데이터를 사용하기 전에 적절한 락을 획득한다
Lock 유지
트랜잭션이 완료될 때까지 락을 유지하고 데이터를 안전하게 읽거나 수정한다
Lock 해제
트랜잭션이 완료되면 락을 해제하고 다른 트랜잭션의 접근을 허용한다
주의사항
데드락(DeadLock)
두 개 이상의 트랜잭션이 서로의 락을 기다리며
무한 대기 상태에 빠지는 현상
락의 획득 순서를 일관되게 유지하거나 타임아웃을 설정하여
장시간 대기하는 트랜잭션을 강제로 중단시켜 방지할 수 있다
락 경합(Lock Contention)
다량의 트랜잭션이 하나의 락을 얻으려고 경쟁할 때
처리 성능이 저하되는 현상
다른 트랜잭션들이 대기 상태에 머물면서
전체적인 처리 성능이 저하될 수 있다
락 경함이 심한 경우 데드락이 발생할 가능성이 높아진다
행 레벨 락이나 옵티미스틱 락과 같은
세밀한 락 전략을 사용하여 방지할 수 있다
요약
- 무한 대기 상태를 방지하기 위해 타임아웃 설정
- 성능 저하 방지를 위해 최소한의 데이터에만 락 사용
- 락 관련 문제를 조기에 발견하기 위한 모니터링과 튜닝
'Computing and DB 🖥 > Database' 카테고리의 다른 글
SQL Injection (0) | 2024.02.02 |
---|---|
[JDBC] - PreparedStatement (0) | 2024.01.31 |
NoSql 이 뭐야? (0) | 2023.12.12 |
대용량을 대비한 DB... 어떻게 설정해? (feat.PostgreSQL) (33) | 2023.11.14 |