Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

DB 락 - 개념 이해 본문

인프런/[인프런] 스프링 DB 1편 - 데이터 접근 핵심 원리

DB 락 - 개념 이해

Seung__ 2022. 6. 1. 18:21
  • 세션1이 트랜잭션을 시작하고 데이터를 수정하는 동안 아직 커밋을 수행하지 않았는데, 
  • 세션2에서 동시에 같은 데이터를 수정하게 되면 여러가지 문제가 발생한다. 
  • 바로 트랜잭션의 원자성이 깨지는 것이다.
  • 여기에 더해서 세션1이 중간에 롤백을 하게 되면 세션2는 잘못된 데이터를 수정하는 문제가 발생한다.
  • 이런 문제를 방지하려면,  세션이 트랜잭션을 시작하고 데이터를 수정하는 동안에는 커밋이나 롤백 전까지
  • 다른 세션에서 해당 데이터를 수정할 수 없게 막아야 한다.

 

lock 0

  • 세션1은 memberA 의 금액을 500원으로 변경하고 싶고,
    세션2는 같은 memberA 의 금액을 1000원으로 변경하고 싶다.
  • 데이터베이스는 이런 문제를 해결하기 위해 락(Lock)이라는 개념을 제공한다.

lock 1

  • 세션1은 트랜잭션을 시작한다.
  • 세션1은 memberA 의 money 를 500으로 변경을 시도한다. 
    이때 해당 로우의 락을 먼저 획득해야 한다.
    락이 남아 있으므로 세션1은 락을 획득한다. (세션1이 세션2보다 조금 더 빨리 요청했다.)
  • 세션1은 락을 획득했으므로 해당 로우에 update sql을 수행한다.
  • transaction이 변경하고자 하는  row에 대한  lock을 획득해야 변경할 수 있음.

 

lock2

  • 세션2는 트랜잭션을 시작한다.
  • 세션2도 memberA 의 money 데이터를 변경하려고 시도한다.
    이때 해당 로우의 락을 먼저 획득해야 한다.
    락이 없으므로 락이 돌아올 때 까지 대기한다.
    참고로 세션2가 락을 무한정 대기하는 것은 아니다. 
    락 대기 시간을 넘어가면 락 타임아웃 오류가 발생한다.
    락 대기 시간은 설정할 수 있다.

lock 3

  • 세션1은 커밋을 수행한다. 
  • 커밋으로 트랜잭션이 종료되었으므로 락도 반납한다.

lock 4

  • 락을 획득하기 위해 대기하던 세션2가 락을 획득한다.

 

lock 5

  • 세션2는 update sql을 수행한다.

 

lock 6

Comments