락에 대해 학습중입니다. (JPA, MySQL, Redis) 락 이용해서 동시성 문제 해결법을 찾고 있습니다.
낙관적 락, 비관적 락, 분산락(네임드 락 이용) 등을 공부하다가 의문이 생겼는데요,
낙관적 락
- 충돌 잦으면 락 획득 재시도 로직 때문에 성능 안좋음
비관적 락
- 충돌 잦으면 낙관적 락보다 성능좋음.
분산 락
- 스케일 아웃된 DB 환경에서도 사용 가능
- Redis 라이브러리마다 다른데
Lettuce는 스핀락으로 구현되서 재시도 많으면 불리
Redisson은 pub-sub 기반이라 재시도 많으면 유리
정확하진 않지만 이렇게 알고있습니다.
질문은
1. 잘못 알고 있나요?
2. 제가 공부한게 맞다면, 분산 환경 고려하면 무조건 비관적 락, 낙관적 락 말고 분산락 + Redis(Lettuce/Redisson) 쓰는게 좋은건가요?
1. 잘못 아는건 없음 2. 니가 말한 분산락이 비관적 락임 2-1. 충돌이 거의 없다고 가정하면 낙관적 락 쓸수도 있지
아하 그런거였군요... 답 찾기 어려웠는데 너무 감사합니다 ㅎㅎ 좋은 저녁 되세요~
저도 질문잇서요~ 보통 프로그램 짤때 CUD 일어날때마다 낙관락 비관락 둘중 하나 걸어주나요? 실무에선 사용자가 다수라서 동시에 요청 들어온다고 가정하고 코드 짜야될거같아서요~
CUD 일어날때 마다 락을 걸어주면 다른 오버헤드가 심해서 동시성 문제가 발생하는 곳만 추려서 락을 걸어주는게 낫지 않으까?
나도 조빱이라서 대기형이 알려줄거야
대부분의 경우에는 따로 락을 걸 필요가 없고 업데이트 구문에서 자동으로 걸리는 배타락이면 충분함
글쿤요... 감사감사감사감사