개발/ETC

공유 락, 배타 락 차이

devhooney 2024. 12. 24. 16:40
728x90

 

 

 

공유 락 배타 락을 알아보자!!

 

 

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. 광고

728x90

 

 

 

 

 

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. 락 타임 아웃을 설정한다.

 

 

 

- 참고

https://haon.blog/haon/jpa/pemistic-lock/

728x90

'개발 > 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