DB Lock (락)
DB Lock(락)은 하나의 데이터를 다른 세션에서 수정하는 것을 방지하는 것이다.
만약 세션 A에서 데이터를 수정하기 위해 트랜잭션을 진행 중이고 아직 커밋 또는 롤백을 수행하지 않았는데, 다른 세션 B에서 동시에 같은 데이터를 수정하게 된다면 여러 가지 문제가 발생할 것이다. 트랜잭션의 원자성이 깨지는 것이다.
DB Lock은 이런 문제를 방지하기 위해 트랜잭션을 시작하고 해당 트랜잭션(세션)이 종료되기 전까지 다른 세션에서 해당 데이터를 수정할 수 없도록 막아주는 역할을 한다.
락을 고려한 트랜잭션 과정
- 락(Lock)은 해당 데이터 수정에 대한 권한 같은 것으로 생각하면 된다.
- 트랜잭션을 시작하고 쿼리를 실행함과 동시에 락을 획득한다.
- 획득한 락은 트랜잭션 종료(커밋/롤백) 시 다시 반납하게 된다.
- 데이터를 수정하려 할 때는 해당 tuple의 락을 먼저 획득해야 한다. 만약 락이 없다면 다른 세션에서 획득한 락을 반납할 때까지 기다린다. (무한정 기다리는 것이 아니다. 시간제한이 있고, 시간이 지나면 락 획득 예외가 발생한다.)
- 세션 1에서 트랜잭션을 시작한다.
- 첫 번째 쿼리를 실행함과 동시에 락을 획득한다.
- 세션 1이 update 문을 실행한다.
- 세션 2에서 트랜잭션을 시작하려고 시도한다.
- 락을 획득하려고 시도하지만, 락이 없어서 대기한다.
- 세션 1에서 커밋을 하며 락을 반납한다.
- 대기하던 세션 2가 락을 획득한다.
- 세션 2가 update 문을 실행한다.
- 세션 2에서 커밋을 하며 락을 반납한다.
SELECT 조회를 위한 락 획득
일반적으로 락은 데이터를 변경하고자 할 때 획득한다. 그러나 조회를 할 때도 락을 필요로 할 때가 있다.
예를 들면 매우 중요한 계산을 하기 위해 데이터를 조회하려 할 때 조회 도중 데이터가 바뀌면 안 될 수도 있다.
이럴 때는 SELECT for update 구문을 이용할 수 있다.
set autocommit false;
SELECT * FROM user WHERE user_id='userA' for update;
commit;
조회를 위한 락 획득도 다른 트랜잭션과 마찬가지로 락 획득 중 데이터를 수정할 수 없다.
트랜잭션 관련 글
📁[Database] 트랜잭션의 동작 원리와 ACID 속성
📁[Database] 트랜잭션 - 락(Lock) 동작 원리와 동작 과정
📁[Java, Spring] 트랜잭션을 적용하는 여러 가지 방법
📁[Spring] @Transactional 세부 설정 - 격리 수준 / 전파 수준 설정
📁[Database] 트랜잭션의 격리성 문제 - Dirty Read / Non-Repeatable Read / Phantom Read
(참고) 인프런 - 김영한 님 스프링 DB 1편
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1#
반응형
'Database > 데이터베이스 이론' 카테고리의 다른 글
[Database] 트랜잭션의 격리성 문제 - Dirty Read / Non-Repeatable Read / Phantom Read (0) | 2024.03.19 |
---|---|
[Database] 트랜잭션의 동작 원리와 ACID 속성 (0) | 2024.03.19 |