동시성 문제 및 DB time out

luckygamza·2022년 3월 13일

동시성 문제 락 걸기(exclusive lock)

여러 명이 동시에 한 청원에 동의를 하는 경우, race Condition 문제가 생길 수 있다.
따라서 exclusive lock을 걸어주어 한 쓰레드가 값을 읽고 있을 때는 다른 쓰레드가 쓰기및 읽기 접근을 하지 못하게 할 필요성이 있다.
락을 걸때, 비관적 락, 낙관적 락 두 가지 방식이 있는데
우리는 version정보를 활용하는 낙관적 락 방식을 사용하기로 하였다.
낙관적 락 방식으로 exclusive lock을 걸기 위해서는

Spring에서는 @OptimisticLock(excluded =true)를 걸어주면 된다.

동시성 테스트해보기

이렇게 락을 걸어주고, 동시성 Test를 진행해 보았다.

100명이 동시에 접근하는 테스트


위에는 쓰레드를 100개 만들어서 동시성 테스트를 해보는 코드이다.

결과는 성공!

3000명이 동시에 접근하는 테스트


이번에는 쓰레드를 3000개 만들어서 동시성 테스트를 해보자.
물론 코드는 numberOfThreads만 3000으로 바뀌었다.

결과는 실패.
3000개 쓰레드 중에서 1797개만 접근해서 동의를 성공시켰고, 나머지는 접근을 하지 못했다.

DB timeout

3000개 쓰레드 테스트가 터진 이유는

DB timeout이 났기 때문이다.
배타적 락이 걸려있기 때문에 접근하지 못하고 기다리고만 있던 쓰레드의 db커넥션들은 하염없이 기다릴 수는 없다.
DB는 지금 상황과 같이 너무 오랫동안 커넥션이 대기하고 하는 요청을 중단시킨다. 이러한 방식은 deadLock 문제를 해결하기 위해서도 쓰인다.

느낀 점😊

데이터베이스 강의 때 배운 개념들을 실제로 접해 볼수 있어서 굉장히 흥미로웠다.ㅎㅎ

0개의 댓글