DB 락

sunghun Jung·2022년 5월 22일
1

김영한님의 DB 강의를 보고 정리하여 작성한 글 입니다. 자세한 내용은 강의를 참고해주시기 바랍니다. https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1/dashboard

각 세션에서 트랜잭션을 진행중일 때 같은 데이터를 수정하게 되면 트랜잭션의 원자성이 깨지게 되고, 세션 1에서 롤백을 할 경우 세션 2는 잘못된 데이터를 수정하게 되는 등 여러 문제가 발생하게 된다.

이런 문제를 방지하기 위해 사용되는 것이 DB의 Lock이다.

  1. 세션1에서 어떤 row에 대해 트랜잭션을 시작하면 해당 row의 lock이 남아 있는지 확인하고, 있다면 lock을 획득하고 sql 쿼리문을 수행한다 (먼저 접근하는 세션이 lock을 획득한다) .
  2. 세션2가 트랜잭션을 시작하고 세션1과 같은 row의 데이터를 수정하려 할 때 세션1이 먼저 lock을 획득하여 작업 중 이므로 lock이 반환될 때 까지 정해진 시간만큼 대기한다 (정해진 시간을 넘어가면 락 타임아웃 오류가 발생한다).
  3. 세션1이 커밋을 수행하면 작업의 결과가 DB에 반영되고 트랜잭션이 종료되면서 락을 반납한다. 대기 중이던 세션2는 반환된 lock을 획득하여 트랜잭션을 시작하고 쿼리문을 수행하고 commit 혹은 rollback까지 일련의 작업을 진행하여 트랜잭션을 종료하고 락을 반납한다.

락을 획득하는 기준

일반적인 데이터 조회는 lock을 사용하지 않는다.
세션 1에서 lock을 획득하여 데이터를 변경하는 작업 중이어도 세션2에서 데이터를 조회는 할 수 있다. 조회 시점부터 lock을 획득하고 싶다면 select for update 구문을 사용하면 조회 시점에 lock획득하여 다른 세션에서 해당 데이터를 변경할 수 없다.

1개의 댓글

comment-user-thumbnail
2022년 6월 17일

잘 이해하고 갑니댜

답글 달기