728x90
InnoDB는 행 수준 잠금을 지원하며 이는 공유(S) 락과 배타(X)락 이라 불립니다.
이번 포스팅에서는 각 락의 특징에 대해서 알아보겠습니다.
공유 락(Shared(S) Lock)
공유 락을 보유한 트랜잭션은 특정 행을 읽을 수 있습니다. 또한, 공유 락에 걸린 데이터는 읽기 연산만 가능하며 쓰기 연산은 불가능합니다. 공유 락에 걸린 데이터는 다른 트랜잭션이 공유 락밖에 휙득하지 못 하며 배타 락은 휙득할 수 없습니다. 공유 락을 사용해 조회하면 트랜잭션 내 조회한 데이터가 변경되지 않음을 보장할 수 있습니다.
아래와 같이 SELECT FOR SHARE 를 사용하여 특정 데이터로부터 공유 락을 획득할 수 있습니다.
SELECT * FROM table_name WHERE id = 1 FOR SHARE;
배타 락(Exclusive(X) Lock)
배타 락을 보유한 트랜잭션은 특정 행에 대하여 읽기 쓰기 모두 가능합니다. 배타 락에 걸린 데이터를 수정하는 방법은 기존에 배타 락을 소유한 트랜잭션이 끝날 때까지 기다리는 방법밖에 없습니다.
즉, 다른 트랜잭션은 해당 데이터에 대해 읽기 작업, 쓰기 작업 모두 수행할 수 없습니다.
아래와 같이 SELECT FOR UPDATE 를 사용하여 특정 데이터로부터 배타 락 을 획득할 수 있다.
SELECT * FROM table_name WHERE id = 1 FOR UPDATE;
잠금 없는 읽기
그렇다면, 특정 데이터가 배타 락이 걸린 상태라면, 해당 데이터는 읽을 수 없을까요?
배타 락이 걸린 행 또한 단순 SELECT 쿼리를 사용해 조회할 수 있습니다.
왜냐하면, 단순 SELECT 쿼리는 레코드를 대상으로 조회하는 것이 아니라 Undo Log에서 해당 트랜잭션 ID보다 작은 ID를 가진 데이터를 조회하기 때문입니다.
728x90
'스터디 > MySQL' 카테고리의 다른 글
외래키와 잠금 (0) | 2025.02.09 |
---|---|
READ COMMITED와 REPEATABLE READ 비교 (0) | 2025.01.06 |
InnoDB스토리지 엔진 수준의 락 (0) | 2025.01.06 |
MVCC(Multi Version Concurrency Control) (0) | 2024.11.27 |
인덱스에 대해서 알아보자 (0) | 2023.09.07 |