관리 메뉴

JIE0025

비관적 락은 무엇이고 왜/언제 사용할까? 본문

CS

비관적 락은 무엇이고 왜/언제 사용할까?

Kangjieun11 2023. 11. 19. 00:18
728x90

✅ 비관적 락 ?

DB관리에서 사용하는 기술 중 하나이다.
 
 
 

충돌이 발생할 것 같으니 <미리> 조치를 취하자.

 
간단하게 설명하면
 
어떤 이용자 A 가 데이터를 Read/Write할 때
미리 락(Lock)을 걸어서
다른 사용자들은 데이터를 동시에 수정 할 수 없게 만드는 것이다.
 
 
 

  • 모든 트랜잭션은 충돌이 발생한다는 것을 가정하고,  우선 락을 거는 방법
  • DB의 Lock 기능을 이용한다. 
  • 트랜잭션을 커밋하기 전, 데이터 수정 시점에 트랙잭션 충돌을 감지할 수 있다.
  • Lock획득까지 트랜잭션이 대기하기 때문에 Timeout을 설정할 수 있다.

 
 
 

✅ 언제 비관적 락을 사용하는가?

- 같은 요청에 대한 충돌 가능성이 높을 때 사용한다. 
 
- 데이터의 무결성이 중요할때 사용한다.
 
 

✍️ Example 01

은행의 계좌 이체 시스템을 생각해보자.
 
두명의 사용자가 동시에 같은 계좌에서 돈을 출금하려고 한다.
이때 계좌의 잔액이 잘못 계산될 수 있는데
 

비관적 락을 사용하면?

첫번째 사용자가 계좌 잔액울 확인/ 출금하는 동안
두번째 사용자는 아예 계좌에 접근할 수 없게 된다.
 
 
 

✍️ Example 02

콘서트 좌석 예약 시스템
 
방탄소년단 콘서트 좌석은 총 5000개가 있다.
이때 3만명의 사용자가 몰렸다고 가정해보자.
이때 앞자리를 사수하기 위해 사용자들이 동일한 좌석을 클릭하게 되는데....
 
 

비관적락을 사용하지 않는다면 ?

데이터에 여러명이 접근할 수 있게 되면서 
최종 결제한 사람을 제외하고는 모조리 실패하게 되기 때문에 사용자 경험이 안 좋아질 것이다.
 

비관적 락을 사용하면?

첫번째 사용자가 좌석을 잡았을떄
두번째 사용자는 아예 좌석에 접근할 수 없게 된다. 
 
 
예약좌석을 가장 먼저 선택한 사람만이 결제할 수 있다면
사람들은 <결제완료>까지의  속도에 대한 경쟁을 안해도 된다.
 
오히려 다른 좌석이 남은게 없는지 빠르게 더 찾아보게 될 것
 
 
 
 

✅ 왜 비관적 락을 사용하는가?

위의 예를 보면 왜 사용하는지 분명하게 알 수 있다. 😎
 
- 비관적 락은 데이터의 무결성을 보장한다. 
 
- 거의 완료된 것에 대해 마무리가 안되면 사용자는 실망할 수 있다.
비관적 락을 사용하면 애초에 자원을 확보하거나, 못하거나 둘중 하나라서 사용자 경험이 개선될 수 있다.
 
 

✅ 비관적 락의 단점은?

모든 트랜잭션에 Lock을 사용하기 떄문에 락이 필요하지 않는 상황에서도 무조건 락을 건다
> 성능상 문제가 발생할 수 있다 (특히 읽기가 많이 이루어지면)
 
 
 
 
 
 
 
 
오늘은 바빠서 평소 글보다 간단하게 적어봤다.
 
 
 

✅ 다음글

SpringBoot와 JPA를 이용한 실습!!! 
 
https://jie0025.tistory.com/604

[JPA] 비관적락을 사용해 동시성 문제 해결하기 (curl command로 동시요청)

✅ 선행 개념 먼저 비관적 락이 무엇인지에 대한 개념은 아래 글에 적어놓았다. https://jie0025.tistory.com/603 비관적 락은 무엇이고 왜/언제 사용할까? ✅ 비관적 락 ? DB관리에서 사용하는 기술 중 하

jie0025.tistory.com

 
 
 


 
references
https://velog.io/@bagt/Database-%EB%82%99%EA%B4%80%EC%A0%81-%EB%9D%BD-%EB%B9%84%EA%B4%80%EC%A0%81-%EB%9D%BD