낙관적 락
- Application Level 에서 관리하는 Lock을 뜻한다.
- 읽기 작업이 빈번하게 일어나고 쓰기 작업같은 경우 적게 일어날 때 이 방법이 유용하다.
- 버전과 TimeStamp 등의 방식을 활용하여 충돌 검사를 수행한다.
- transaction 1 이 karol(id = 2) 조회
- transaction 2 이 karol(id = 2) 조회
- transaction 2 이 karol(id = 2) 를 karol2로 변경 요청
- Application이 변경요청을 받고 name 변경과 함께 version을 변경을 DB에 요청 후 적용
- trasaction 1에서 karol(id = 2)를 karol1으로 변경 요청했으나 버전이 달라 실패
비관적 락
- DB Level에서 관리하는 Lock을 뜻한다.
- 항상 충돌이 일어난다는 가정을 하고 접근이 일어날 때마다 DB에 락을 걸어준다.
- transaction 1이 karol(id=2)를 조회 (공유 락 획득)
- transaction 2이 karol(id=2)를 조회
- transaction 2이 karol(id=2)를 karol2 로 변경 요청 (공유 락 존재로 대기)
- transaction 1이 공유 락 반납
- transaction 2가 배타 락을 획득하여 쓰기 작업 수행
- 반영 완료
대표적으로 두 가지 방법으로 거는 비관적 락 방식이 있다.
공유 락 (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 |