동시에 같은 데이터를 수정하게 될 경우 DB락이 어떻게 동작하는지 정리하려 한다.
1. 문제점
세션1이 트랜잭션을 시작하고 데이터를 수정하는 동안(커밋 연산이 일어나기 전) 세션2에서 같은 데이터를 수정하게 되면 여러가지 문제가 발생한다.
첫번째, 트랜잭션의 원자성(트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야 한다는 원칙)이 깨진다.
두번째, 세션1이 커밋 연산이 아닌 롤백 연산을 실행하게 될 경우, 세션2는 잘못된 데이터를 수정하게 된다.
이와 같은 문제를 방지하려면, 세션이 트랜잭션을 시작하고 데이터를 수정하는 동안(커밋이나 롤백 연산이 일어나기 전) 다른 세션에서 해당 데이터를 수정할 수 없게 막아야 한다.
데이터베이스는 이런 문제를 해결하기 위해 락(Lock)이라는 개념을 제공한다.
2. DB락 동작
세션1은 memberA의 금액을 500원으로 변경하려 하고, 세션2는 같은 memberA의 금액을 1000원으로 변경하려 한다.
이와 같은 상황에서 데이터베이스 제공 락(Lock) 개념은 어떻게 동작하는지 알아보자.
1. 세션1은 트랜잭션을 시작한다.
2. 세션1은 memberA의 money를 500으로 변경을 시도한다. 이때 해당 로우의 락(Lock)을 먼저 획득해야 하며, 현재 해당 로우의 락이 존재하므로 세션1은 락을 획득한다.
3. 세션1은 락을 획득했으므로 해당 로우에 update를 수행한다.
4. 세션2는 트랜잭션을 시작한다.
5. 세션2도 memberA의 money 데이터를 변경하려 시도한다. 이때 해당 로우의 락을 먼저 획득해야 하며, 현재 해당 로우의 락이 존재하지 않으므로 락이 돌아올 때까지 대기한다.
참고: 세션2는 락을 무한정 대기하지 않는다. 대기 시간을 넘어가면 락 타임아웃 오류가 발생하며 대기 시간은 설정할 수 있다.
6. 세션1은 커밋을 수행한다. 커밋 연산으로 트랜잭션이 종료되어 해당 로우의 락을 반납한다.
락을 획득하기 위해 대기하고 있던 세션2는 반납된 락을 획득한다.
7. 세션2는 락을 획득했으므로 update를 수행한다.
8. 세션2는 커밋을 수행한다. 커밋 연산으로 트랜잭션이 종료되어 해당 로우의 락을 반납한다.
3. DB락 - 조회
일반적인 조회는 락을 사용하지 않는다.
데이터베이스마다 다르지만, 보통 데이터를 조회할 때는 락을 획득하지 않고 바로 데이터를 조회할 수 있다.
예를 들어 세션1이 락을 획득하고 데이터를 변경하고 있어도 세션2는 데이터를 조회할 수 있다.
조회와 락
데이터를 조회할 때도 락을 사용할 수 있는데 이때는 select for update 구문을 사용하면 된다.
이렇게 하면 세션1이 조회 시점에 락을 획득하기 때문에 다른 세션에서 해당 데이터를 변경할 수 없다.
조회 시점에 락이 필요한 경우
트랜 잭션 종료 시점까지 해당 데이터를 다른 곳에서 변경하지 못하도록 강제로 막아야 하는 경우에 사용한다.
Reference.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1
'Database' 카테고리의 다른 글
[Database] 2. 데이터베이스 연결 구조와 DB 세션 (0) | 2024.04.18 |
---|---|
[Database] 1. 트랜잭션에 대한 이해 (0) | 2024.04.11 |
[Database] Oracle / MySQL의 특징과 차이 (0) | 2022.07.22 |
[Database] 데이터베이스 RDBMS / NOSQL 에 관하여 (0) | 2022.07.21 |
[MySql] Select 하여 Insert 하기 (0) | 2021.09.11 |