[DataBase] 트랜잭션 - 락(Lock) 동작 원리와 동작 과정

2024. 3. 19. 23:07·Database

DB Lock (락)


DB Lock(락)은 하나의 데이터를 다른 세션에서 수정하는 것을 방지하는 것이다.

 

만약 세션 A에서 데이터를 수정하기 위해 트랜잭션을 진행 중이고 아직 커밋 또는 롤백을 수행하지 않았는데, 다른 세션 B에서 동시에 같은 데이터를 수정하게 된다면 여러 가지 문제가 발생할 것이다. 트랜잭션의 원자성이 깨지는 것이다.

 

DB Lock은 이런 문제를 방지하기 위해 트랜잭션을 시작하고 해당 트랜잭션(세션)이 종료되기 전까지 다른 세션에서 해당 데이터를 수정할 수 없도록 막아주는 역할을 한다.

 


락을 고려한 트랜잭션 과정

  • 락(Lock)은 해당 데이터 수정에 대한 권한 같은 것으로 생각하면 된다.
  • 트랜잭션을 시작하고 쿼리를 실행함과 동시에 락을 획득한다.
  • 획득한 락은 트랜잭션 종료(커밋/롤백) 시 다시 반납하게 된다.
  • 데이터를 수정하려 할 때는 해당 tuple의 락을 먼저 획득해야 한다. 만약 락이 없다면 다른 세션에서 획득한 락을 반납할 때까지 기다린다. (무한정 기다리는 것이 아니다. 시간제한이 있고, 시간이 지나면 락 획득 예외가 발생한다.)

  1. 세션 1에서 트랜잭션을 시작한다.
  2. 첫 번째 쿼리를 실행함과 동시에 락을 획득한다.
  3. 세션 1이 update 문을 실행한다.
  4. 세션 2에서 트랜잭션을 시작하려고 시도한다.
  5. 락을 획득하려고 시도하지만, 락이 없어서 대기한다.
  6. 세션 1에서 커밋을 하며 락을 반납한다.
  7. 대기하던 세션 2가 락을 획득한다.
  8. 세션 2가 update 문을 실행한다.
  9. 세션 2에서 커밋을 하며 락을 반납한다.

SELECT 조회를 위한 락 획득

일반적으로 락은 데이터를 변경하고자 할 때 획득한다. 그러나 조회를 할 때도 락을 필요로 할 때가 있다. 

예를 들면 매우 중요한 계산을 하기 위해 데이터를 조회하려 할 때 조회 도중 데이터가 바뀌면 안 될 수도 있다.

이럴 때는 SELECT for update 구문을 이용할 수 있다.

set autocommit false;
SELECT * FROM user WHERE user_id='userA' for update;
commit;

 

조회를 위한 락 획득도 다른 트랜잭션과 마찬가지로 락 획득 중 데이터를 수정할 수 없다.


트랜잭션 관련 글

📁[Database] 트랜잭션의 동작 원리와 ACID 속성

📁[Database] 트랜잭션 - 락(Lock) 동작 원리와 동작 과정

📁[Java, Spring] 트랜잭션을 적용하는 여러 가지 방법

📁[Spring] @Transactional 세부 설정 - 격리 수준 / 전파 수준 설정

📁[Database] 트랜잭션의 격리성 문제 - Dirty Read / Non-Repeatable Read / Phantom Read


(참고) 인프런 - 김영한 님 스프링 DB 1편
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1#

 

반응형
저작자표시 (새창열림)

'Database' 카테고리의 다른 글

[Database / SQLD] 데이터 모델링의 이해 (Part1 - Ch01)  (0) 2024.04.19
[Database] 트랜잭션의 격리성 문제 - Dirty Read / Non-Repeatable Read / Phantom Read  (0) 2024.03.19
[Database] 트랜잭션의 동작 원리와 ACID 속성  (0) 2024.03.19
[DB / SQL] DB Join 조인 (left join / right join / inner join / outer join)  (0) 2024.02.22
[Redis] 레디스 설치 및 기본 기능  (0) 2023.11.07
'Database' 카테고리의 다른 글
  • [Database / SQLD] 데이터 모델링의 이해 (Part1 - Ch01)
  • [Database] 트랜잭션의 격리성 문제 - Dirty Read / Non-Repeatable Read / Phantom Read
  • [Database] 트랜잭션의 동작 원리와 ACID 속성
  • [DB / SQL] DB Join 조인 (left join / right join / inner join / outer join)
HSRyuuu
HSRyuuu
Web Server Developer hsryuuu
  • HSRyuuu
    HS_dev_log
    HSRyuuu
  • 전체
    오늘
    어제
  • 링크

    • Github
    • 전체 글 보기 (248) N
      • AI (5) N
      • Spring (37)
      • Infra & DevOps (20)
      • Java (25)
      • Database (28)
      • Web & Network (14)
      • 자료구조 & 알고리즘 (30)
      • Computer Science (24)
      • Frontend (17)
        • Vue.js & Nuxt.js (9)
        • JSP_Thymeleaf (7)
      • etc (48)
        • 오픈소스 라이브러리 (5)
        • 코딩테스트 (13)
        • Trouble Shooting (7)
        • Tech Interview (6)
        • Book Review (9)
        • 끄적끄적... (6)
        • 개인 프로젝트 (2)
  • 블로그 메뉴

    • 홈
    • 태그
  • 인기 글

  • 태그

    MySQL
    SQL
    Spring
    TechInterview
    Nuxt3
    Java
    docker
    자료구조
    기술면접
    Linux
    cleancode
    백엔드
    JPA
    백엔드스쿨
    트랜잭션
    리눅스
    백엔드공부
    SpringBoot
    클린코드
    백준
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.4
HSRyuuu
[DataBase] 트랜잭션 - 락(Lock) 동작 원리와 동작 과정
상단으로

티스토리툴바