728x90
목차
- 락이란?
- 낙관적 락(Optimistic Lock)
- 비관적 락(Pessimistic Lock)
- 낙관적 락 vs 비관적 락
- 결론
1. 락이란?
여러 개의 트랜잭션이 동시에 접근했을 때, 데이터의 일관성이 깨질 수 있기 때문에 락(잠금)을 걸고 이를 관리하는 것을 Locking이라고 한다.
예를 들어, 3000원이 있는 계좌에 A와 B가 3000원을 입금했는데 이 과정이 동시에 이루어져서 A와 B가 동시에 3000원을 읽어서 3000원을 더해버리는 바람에 최종 금액이 9000원이 아니라 6000원이 되버리는 현상을 막기 위해 필요하다.
2. 낙관적 락(Optimistic Lock)
- 낙관적인 락은 데이터를 읽을 때는 락을 걸지 않고, 데이터를 업데이트할 때 충돌이 발생하지 않았는지 확인하는 방식이다.
- 데이터를 읽을 때는 다른 트랜잭션이 데이터를 수정하지 않을 것으로 가정하고 락을 걸지 않는다.
- 데이터를 업데이트할 때 실제로 락을 확인하고 충돌이 발생하면 롤백 또는 충돌을 해결하는 방법을 적용한다.
- 낙관적인 락은 동시성이 높은 환경에서 성능을 향상시킬 수 있지만, 충돌이 발생할 가능성이 높은 경우 롤백이나 재시도가 필요할 수 있다.
기본적으로 데이터 갱신시 충돌이 발생하지 않을 것 으로 간주하는 방식을 Optimistic Lock(낙관적인 락)이라고 한다.
설명 그대로 데이터 갱신시 충돌이 발생하지 않을 것이라고 예상하기 때문에, 락을 걸지 않는다.
낙관적인 락은 Version을 사용해 관리한다.
- Alice와 Bob이 같은 데이터를 읽어 Version1 값을 가져간다.
- Bob이 먼저 업데이트 커밋을 보내게 되면서 Version이 2로 올라간다.
- Alice도 업데이트 커밋을 날리면서 Version을 2로 올린다.
- 이미 Version 2가 존재하기 때문에 Optimistic Lock Exception이 터진다.
3. 비관적 락(Pessimistic Lock)
- 비관적인 락은 데이터를 읽을 때부터 락을 걸고, 업데이트가 완료될 때까지 락을 유지하는 방식이다.
- 데이터를 읽을 때 락을 걸기 때문에 다른 트랜잭션이 해당 데이터를 읽거나 수정할 수 없다.
- 비관적인 락은 데이터 충돌을 최소화하지만, 동시성이 낮아질 수 있고, 락 경합이 발생할 경우 성능 저하가 발생할 수 있다.
기본적으로 데이터 갱신시 충돌이 발생할 것 으로 보고 미리 잠금을 하는 방식을 Pessimistic Lock(비관적인 락)이라고 한다.
설명 그대로 데이터 갱신시 충돌이 발생할 것으로 예상하고, 우선적으로 락을 건다.(조회 시점부터)
- 운영자가 주문 정보를 조회한다. 이 순간 데이터에 락이 걸린다.
- 고객이 같은 주문 정보를 조회하지만 락이 걸려있기에 대기한다.
- 운영자가 작업을 끝내고 잠금을 해제하면 이때, 고객의 로직이 수행된다.
무결성에 장점이 있지만 데드락의 위험성이 존재하게 된다.
비관적인 락에 아래와 같이 추가 설정이 가능하다.
- Exclusive Lock
- 위에서 설명한 그림
- 다른 사용자가 읽기, 수정, 삭제 모두 불가능
- Shared Lock
- 다른 사용자가 동시에 읽을 수는 있지만, Update, Delete 작업은 방지
4. 낙관적 락 vs 비관적 락
구분 | Optimistic Lock | Pessimistic Lock |
정의 | 충돌이 없을 것으로 가정하여 락을 걸지 않음 | 충돌을 예상하고 미리 락을 검 |
사용법 | JPA 사용시 @Version 동작 원리가 단순해 Mybatis의 경우 직접 만들어 사용 | Mode 설정 및 쿼리에 직접 사용, DB단에서 설정 가능 |
별칭 | 낙관적인 락 / 비선점적인 락 | 비관적인 락 / 선점적인 락 |
장점 | 데드락 가능성이 적으며 성능의 이점 | 충돌에 대한 오버헤드가 줄어들며 무결성을 지키기 용이 |
단점 | 충돌이 발생하면 오버헤드 발생 | 충돌이 없으면 오버헤드가 발생 |
5. 결론
- 읽기와 수정의 비율이 어디에 가까운지를 잘 판단해서 결정해야 한다.
- 수정의 비율이 높다면 Pessmistic Lock을 사용하고 읽기의 비율이 높다면 Optimistic Lock을 사용한다.
- 일반적으로 웹 애플리케이션은 주로 읽기 수행작업이 많기 때문에 Optimistic Lock을 주로 사용한다.
참고
반응형
'Database' 카테고리의 다른 글
MySQL Index에 대해 알아보자 (0) | 2023.11.07 |
---|---|
MYSQL __SELECT FOR UPDATE__ (0) | 2023.08.04 |
Mybatis #과 $차이 (0) | 2023.06.30 |
JOIN의 종류(INNER, OUTER, CROSS, SELF JOIN) (0) | 2023.06.23 |
트랜잭션 MySQL Isolation level (0) | 2023.06.14 |