낙관적(Optimistic) 락과 비관적(Pessimisitc)락
두 락의 차이를 알아봅니다.
Goal
- 낙관적 락과 비관적 락에 대해서 알아봅니다.
- 비관적 락에 사용되는 공유락(Shared Lock) 과 **베타락(Exclusive Lock)**에 대해서 알아봅니다.
- 언제 어떤 락을 써야할지에 대해서 고민해봅니다.
비관적 락
자원 요청에 따른 동시성문제가 발생할것이라고 예상하고 락을 걸어버리는 방법론입니다.
- 트랜잭션의 충돌이 발생한다고 가정합니다.
- 하나의 트랜잭션이 자원에 접근시 락을 걸고, 다른 트랜잭션이 접근하지 못하게 합니다.
- 데이터베이스에서 Shared Lock(공유, 읽기 잠금) 이나 Exclusive Lock(배타, 쓰기 잠금) 을 겁니다.
- Shared Lock 의 경우, 다른 트랜잭션에서 읽기만 가능합니다. 또한 Exclusive lock 적용이 불가능합니다. (읽는동안 변경하는것을 막기 위해)
- Exclusive lock 의 경우. 다른 트랜잭션에서 읽기, 쓰기가 둘다 불가능합니다. 또한 Shared, Exclusive Lock 적용이 추가적으로 불가능합니다. (쓰는동안 읽거나, 다른 쓰기가 오는것을 막기위해)
-- Shared Lock이 걸린경우
1번 트랜잭션: 1번 유저의 닉네임을 읽음
2번 트랜잭션: 1번 유저의 닉네임을 jys로 변경함
-- 유저테이블에 1번 유저 unluckyjung 이라는 닉네임이 있다고 가정합니다.
1번 트랜잭션이 unluckyjung 데이터를 먼저 읽고 있을때 2번 트랜잭션이 접근한다면
1번 트랜잭션이 작업하는동안, 2번 트랜잭션은 읽기는 가능하나 jys 으로 변경하진 못합니다.
장점
- 충돌이 자주 발생하는 환경에 대해서는 롤백의 횟수를 줄일 수 있으므로 성능에서 유리합니다.
- 데이터 무결성을 보장하는 수준이 매우 높습니다.
단점