반응형
매일메일을 통해
하루하루 CS 공부하기!
공유 락과 배타 락은 데이터 일관성과 무결성을 위해 사용되는 락 유형이다.
공유 락 (Shared Lock)이란?
읽기 락 (Read Lock)이라고 부르며, 공유 락이 걸린 데이터는 SELECT 연산만 가능하며, 쓰기 (UPDATE, DELETE) 연산은 불가능하다.
공유 락이 걸린 데이터에 대해서 다른 트랜잭션에서도 Shared Lock을 획득할 수 있지만, Exclusive Lock은 획득할 수 없다.
즉, 공유 락을 사용하면 트랜잭션 내에서 조회한 데이터의 무결성을 보장.
SELECT * FROM table_name WHERE id = 1 FOR SHARE;
배타 락 (Exclusive Lock)이란?
쓰기 락 (Write Lock)이라고 부르며, 배타 락을 획득한 트랜잭션은 R/W 모두 가능하지만, 다른 트랜잭션에서는 모두 불가능하다.
즉, 배타 락을 획득한 트랜잭션은 데이터에 대한 독점권을 가짐.
SELECT * FROM table_name WHERE id = 1 FOR UPDATE;
데드 락의 발생
데드락 (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 트랜잭션이 락을 해제할 때 까지 대기한다.
해결 방법
- 트랜잭션에서 락 획득 순서를 일관되게 합니다. 모든 트랜잭션에서 1번 데이터, 2번 데이터 순으로 락을 획득할 시 데드 락이 발생하지 않습니다.
- 락 타임 아웃을 설정합니다.
반응형
'Back-end' 카테고리의 다른 글
[Back-End] DBMS에서 동시성을 제어하는 방법 (0) | 2025.01.08 |
---|---|
[Back-End] 웹사이트에 처음 접근했을 때 발생하는 일련의 과정 (1) | 2025.01.07 |
[Back-End] 스레드, 프로세스, 코어의 수는 많을수록 좋을까요? (2) | 2025.01.02 |
[Back-End] Sync와 Async 그리고 Blocking와 Non-Blocking? (2) | 2024.12.30 |
[Back-End] 로그와 메트릭에 대해 설명해봐라! (2) | 2024.12.19 |