DB 락 - 개념 이해

현시기얌·2022년 6월 10일
0

데이터베이스

목록 보기
9/16
post-custom-banner

개념 이해

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

락0

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

락1

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

락2

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

락3

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

락4

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

락5

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

락6

  1. 세션2는 커밋을 수행하고 트랜잭션이 종료되었으므로 락을 반납한다.
profile
현시깁니다
post-custom-banner

0개의 댓글