DB 락 - 변경

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

데이터베이스

목록 보기
10/16

기본 데이터 입력

락0

락1


  • 세션1이 트랜잭션을 시작하고 memberA의 데이터를 500원으로 업데이트 했다.
    아직 커밋은 하지 않았다.
  • memberA 로우의 락은 세션1이 가지게 된다.

락2

  • 세션2는 memberA의 데이터를 1000원으로 수정하려 한다.
  • 세션1이 트랜잭션을 커밋하거나 롤백해서 종료하지 않았으므로 아직 세션1이 락을 가지고 있다.
    따라서 세션2는 락을 획득하지 못하기 떄문에 데이터를 수정할 수 없다.
  • 세션2는 락이 돌아올 때 까지 대기하게 된다.
    SET LOCK_TIMEOUT 60000 : 락 획득 시간을 60초로 설정한다.
    60초안에 락을 얻지 못하면 예외가 발생한다.

세션2 락 획득

  • 세션1이 커밋하면 세션1이 커밋되면서 락을 반납한다.
    이후에 대기하면 세션2가 락을 획득하게 된다.
  • 따라서 락을 획득한 세션2의 업데이트가 반영되는 것을 확인할 수 있다.
    물론 이후에 세션2도 커밋을 호출해서 락을 반납해야 한다.

락3


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

락4

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

락5

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

락6


  • 세션2는 커밋을 수행하고 트랜잭션이 종료되었으므로 락을 반납한다.

세션2 락 타임아웃

  • SET LOCK_TIMEOUT <milliseconds> : 락 타임아웃 시간을 설정한다.
    • ex) SET LOCK_TIMEOUT 10000 10초, 세션2에 설정하면 세션2가 10초 동안 대기해도 락을 얻지 못하면 락 타임아웃 오류가 발생한다.
profile
현시깁니다

0개의 댓글