공유 락 배타 락을 알아보자!!
1. 개념
유 락과 배타 락은 비관적 락(Pessimistic Lock)의 데이터 일관성과 무결성을 위해 사용하는 락 유형이다.
- 공유 락
공유 락은 읽기 락(Read Lock)이라고 부르며, 공유 락이 걸린 데이터는 읽기(SELECT)연산만 가능하며, 쓰기(UPDATE, DELETE)는 불가능하다.
공유 락이 걸린 데이터에 대해서 다른 트랜잭션에서도 공유 락을 획득할 수 있지만, 배타 락은 획득할 수 없다.
즉, 공유 락을 사용하면 트랜잭션 내에서 조회한 데이터가 변경되지 않는다는 것을 보장한다.
SELECT * FROM table_name WHERE id = 1 FOR SHARE;
- 배타 락
배타 락은 쓰기 락(Write Lock)이라고 부르며, 배타 락을 획득한 트랜잭션은 읽기, 쓰기 연산 모두 가능하다.
하지만 다른 트랜잭션에서는 읽기, 쓰기 모두 불가능하다.
즉, 배타 락을 획득한 트랜잭션은 데이터에 대한 독점권을 가진다.
SELECT * FROM table_name WHERE id = 1 FOR UPDATE;
정리하자면, 공유 락이 걸린 데이터는 다른 트랜잭션에서 공유 락을 획득 할 수 있고, 배타 락이 걸린 데이터는 다른 트랜잭션에서 어떤 종류의 락도 획득할 수 없어서 대기하게 된다.
2. 광고
3. 배타 락과 데드 락
데드 락(Dead Lock)이란 교착 상태로, 두개 이상의 트랜잭션이 서로 필요로 하는 데이터의 락을 점유하고 있어서 무한히 대기하는 상황을 말한다.
트랜잭션은 락을 획득하지 못하는 경우, 다른 트랜잭션이 점유하고 있는 락이 해제될 때 까지 대기한다.
트랜잭션 A, B가 있고 id가 1, 2인 데이터가 있는 상황에 두 트랜잭션이 시작한다.
트랜잭션 A는 id 1번을 읽고, 2번 데이터를 변경하는 트랜잭션이다.
트랜잭션 B는 id 2번을 읽고 1번을 변경하는 트랜잭션이다.
데드 락 상황
A는 1번, B는 2번 데이터에 대해 공유 락을 획득합니다.
A는 2번 데이터의 공유 락을 가지고 있는 B 트랜잭션이 락을 해제할 때 까지 대기합니다.
B는 1번 데이터의 공유 락을 가지고 있는 A 트랜잭션이 락을 해제할 때 까지 대기합니다.
4. 데드 락 해결 방법
1. 트랜잭션에서 락 획득 순서를 일관되게 한다. 모든 트랜잭션에서 1번 데이터, 2번 데이터 순으로 락을 획득할 시 데드 락이 발생하지 않는다.
2. 락 타임 아웃을 설정한다.
- 참고
'개발 > ETC' 카테고리의 다른 글
단위 테스트, 통합 테스트 차이 (69) | 2025.01.02 |
---|---|
TCP 3-way handshake 알아보기 (61) | 2024.12.29 |
로그와 메트릭 알아보기 (77) | 2024.12.14 |
트랜잭션 격리수준 알아보기 (120) | 2024.12.09 |
데이터베이스 인덱스 알아보기 (82) | 2024.12.07 |