최종프로젝트 13일차

kinkin_a·2025년 4월 17일

내일배움캠프 TIL

목록 보기
96/100
  • 진도가 거의 안나감
  • 분산락+낙관적락은 보통 분산락 먼저 실행 후 낙관적락
  • 다시 락에 대한 개념 정리(반복!ㅠ)

동시성 제어: 한정된 자원에 여러 요청이 동시에 들어올 때 DB의 데이터에 잘못된 update를 막는 것. 락을 걸지 않으면 한정된 자원을 수많은 요청이 가져가버리는 큰일나는 일이 발생!

  • 낙관적 락: 충돌이 발생하지 않을 거라 믿고, 모든 요청을 우선 받음. 객체에 @version을 추가해 순서를 정하기에, 만약 여러 요청이 @version=4인 경우일 때 수정하려 한다면 한 요청이 version=5로 바꾸기 때문에, 나머지 요청은 수정에 실패하고 에러가 난다. 이를 방지하기 위해서 재시도로직 @Retryable를 추가하는 경우도 있음.
    자원, 요청을 받는 시간이 넉넉할 때 만에 하나를 대비해 넣는 락.

    📌낙관적 락은 락을 걸지 않는다.

  • 비관적 락: 충돌이 반드시 일어난다고 예상하고, 한 요청이 데이터에 접근하면 락을 걸어버림. 그리고 해제해야 다음 대기 요청들이 데이터에 접근. 다시 한 요청만 데이터에 접근해 락을 걸어버림.
    단점은 데드락 가능성 있음, 대기시간 지연.
    데드락은 두 요청이 각자 접근한 데이터에 락을 걸고 수정 후 서로의 데이터에 접근하려 할 때 락을 풀지 못해서 영원히 대기상태에 있는 것. 해결방법은 모든 요청의 데이터 접근 순서를 통일시키는 것.

     Thread t1 = new Thread(() -> executeInOrder(lockA, lockB), "Thread-1");
           Thread t2 = new Thread(() -> executeInOrder(lockA, lockB), "Thread-2"); // 동일 순서로 잠금
    
           t1.start();
           t2.start();```
           
    
  • 분산 락: 분산시스템에서도 동일하게 락을 걸 수 있음. TTL로 데이터 접근 시간을 정할 수 있음. 빠르고 편함. 단점은 레디스가 단일 인스턴스일 경우 레디스가 상실하면 락이 사라질 수 있음.

0개의 댓글