Project/Java

[Spring] 동시성 문제

공부좀하시졍 2025. 4. 9. 15:39

동시성 문제

동일한 하나의 데이터에 여러 스레드가 동시에 접근하여 데이터를 동시에 제어할 때 나타나는 문제로, 하나의 세션이 데이터를 수정 중일 때, 다른 세션에서 수정 전의 데이터를 조회해 로직을 처리하면서 데이터의 정합성이 깨지는 문제 입니다.

 

ex. 재고, 계좌잔액 등

 

동시성 문제 해결하기

Synchronized

  • 스레드 동기화를 위해 자바에서 지원하는 기술
  • 하나의 공유자원에 동시에 접근하지 못하게 함
  • 스레드간 동기화를 시켜 공유되는 데이터가 Thread-safe 하게 함
    • thread-safe ?
    • 멀티 스레드 프로그래밍에서 어떤 함수나 변수, 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없는 것
public synchronized void decrease(Long id, int amount) {
	/* 재고 감소 로직*/
}

 

Synchronized 문제점

  • 하나의 프로세스 안에서만 보장됨
    • 여러 서버에서 공유 자원에 접근 시 원활하게 동작하지 않을 수 있음

 

Database 이용

  • Pessimistic Lock
    • 실제 데이터에 Lock을 걸어서 정합성을 맞추는 방법
    • exclusive lock을 걸게되면 다른 트랜잭션에서는 lock이 해제되기전에 데이터를 가져갈 수 없음
    • 자원 요청에 따른 동시성 문제가 발생할 것이라고 예상하고 락을 걸어버리는 비관적 락 방식
    • 데드락이 걸릴 수 있기 때문에 주의해서 사용해야 함
  • Optimistic Lock
    • 실제로 Lock을 이용하지 않고 버전을 이용해 정합성을 맞추는 방법
    • 먼저 데이터를 읽은 후에 update를 수행할 때 현재 내가 읽은 버전이 맞는지 확인하며 업데이트 함
    • 자원에 락을 걸어서 선점하지 않고, 동시성 문제가 발생하면 그때가서 처리하는 낙관적 락 방식
    • 내가 읽은 버전에서 수정사항이 생겼을 경우 application에서 다시 읽은 후에 작업을 수행하는 롤백 작업을 수행해야 함
  • Named Lock
    • 이름을 가진 metadata locking
    • 이름을 가진 lock을 획득 후 해제할 때 까지 다른 세션은 이 lock을 획득할 수 없음
    • 트랜잭션이 종료될 때 lock이 자동으로 해제되지 않음
    • 별도의 명령어로 해제를 수행하거나 선점시간이 끝나야 해제됨

 

[참조] https://velog.io/@fill0006/Spring-%EB%8F%99%EC%8B%9C%EC%84%B1-%EB%AC%B8%EC%A0%9C%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%95%ED%95%A9%EC%84%B1-%EB%BF%8C%EC%85%94%EB%B3%B4%EA%B8%B0

 

Spring 동시성 문제(데이터 정합성) 뿌셔보기~

재고 시스템을 통해 동시성 문제를 알아보고, 이를 해결해보겠다. 동시성 문제란, 동일한 하나의 데이터에 2 이상의 스레드, 혹은 세션에서 가변 데이터를 동시에 제어할 때 나타는 문제로, 하나

velog.io

https://thalals.tistory.com/370

 

[Spring & Java] 🚀 재고시스템으로 알아보는 동시성이슈 해결방법

인프런 "재고시스템으로 알아보는 동시성 이슈 해결방법" 강의를 보고 정리한 글입니다.📗 Spring & Java, Mysql, Redis 를 이용합니다재고시스템을 활용해서, 멀티스레드 혹은 분산환경에서 가변데이

thalals.tistory.com