낙관적 락 과 비관적 락

2024. 11. 18. 16:47·DB

낙관적 락

  • Application Level 에서 관리하는 Lock을 뜻한다.
  • 읽기 작업이 빈번하게 일어나고 쓰기 작업같은 경우 적게 일어날 때 이 방법이 유용하다.
  • 버전과 TimeStamp 등의 방식을 활용하여 충돌 검사를 수행한다.

  1. transaction 1 이 karol(id = 2) 조회
  2. transaction 2 이 karol(id = 2) 조회
  3. transaction 2 이 karol(id = 2) 를 karol2로 변경 요청
  4. Application이 변경요청을 받고 name 변경과 함께 version을 변경을 DB에 요청 후 적용
  5. trasaction 1에서 karol(id = 2)를 karol1으로 변경 요청했으나 버전이 달라 실패

 

 

비관적 락

  • DB Level에서 관리하는 Lock을 뜻한다.
  • 항상 충돌이 일어난다는 가정을 하고 접근이 일어날 때마다 DB에 락을 걸어준다.

  1. transaction 1이 karol(id=2)를 조회 (공유 락 획득)
  2. transaction 2이 karol(id=2)를 조회
  3. transaction 2이 karol(id=2)를 karol2 로 변경 요청 (공유 락 존재로 대기)
  4. transaction 1이 공유 락 반납
  5. transaction 2가 배타 락을 획득하여 쓰기 작업 수행
  6. 반영 완료

 

대표적으로 두 가지 방법으로 거는 비관적 락 방식이 있다.

 

공유 락 (Shared Lock) 

  • 공유 락은 읽기 작업을 수행할 때 쓰기 작업을 하지 못하도록 락을 거는 것을 말한다.
  • 한 트랜잭션에서 '공유 락'을 들고 있다면 오직 읽기 작업만이 가능하다. 
  • 한 트랜잭션이 공유락을 들고 있다면, 다른 락 또한 공유락 획득이 가능하다.
  • MySQL에서 for share를 추가하는 형태로 쓰인다. 
  • ex) SELECT * from student for sharesad

 

배타 락 (Exclusive Lock)

  • 배타 락은 쓰기 작업을 수행할 때  쓰기 작업을 하지 못하도록 락을 거는 것을 말한다.
  • 한 트랜잭션이 '배타 락'을 들고 있다면 오직 읽기 작업만이 가능하다.
  • 한 트랜잭션에서 '배타 락'을 들고 있다면 다른 트랜잭션은 '배타 락'을 획득할 수 없다.
  • MySQL에서 for update 를 추가하는 형태로 쓰인다.
  • ex) SELECT * FROM student for update

'DB' 카테고리의 다른 글

이상 현상과 정규화  (2) 2024.11.19
트랜잭션 ACID 원칙  (0) 2024.11.18
인덱스 (index) (2)  (1) 2024.11.15
인덱스 (Index)  (1) 2024.11.15
순차 IO / 랜덤 IO  (0) 2024.11.14
'DB' 카테고리의 다른 글
  • 이상 현상과 정규화
  • 트랜잭션 ACID 원칙
  • 인덱스 (index) (2)
  • 인덱스 (Index)
CoMeangMeangIn
CoMeangMeangIn
코딩하는 코맹맹이
  • CoMeangMeangIn
    CoMeangMeangIn
    CoMeangMeangIn
  • 전체
    오늘
    어제
    • 분류 전체보기 (22)
      • java (3)
        • spring (1)
        • build (1)
      • DB (16)
      • 알고리즘 (1)
      • 회고 (1)
      • git (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
CoMeangMeangIn
낙관적 락 과 비관적 락
상단으로

티스토리툴바