프로젝트를 진행하던 중,
동시성 문제가 발생하였다. 내용은 아래와 같다.
[참고자료]
https://isntyet.github.io/jpa/JPA-%EB%B9%84%EA%B4%80%EC%A0%81-%EC%9E%A0%EA%B8%88(Pessimistic-Lock)/
Like기능 동시성 문제발생
Like기능
1회 클릭 시, 상품에 대한 좋아요 완료. 다시 클릭할 시 좋아요 취소.
문제상황
빠르게 클릭할 시, 동시성 문제가 발생하여 다시 취소가 되지않는 현상이 발생하였음.
트랜잭션끼리 충돌하여 문제가 발생한 것으로 파악되었음.
해결방법
Transactional이 완료되기 이전까지 다른 작업이 간섭하지 못하도록 제어해야할 필요성이 있었음.
이에 DB에서 제공하는 락기능을 활용하여, 비관적 잠금(Pessimistic Lock)을 도입할 예정.
이였으나...
나의 단순한 로직 실수였다.
타인과 공유하고 있는 자원이 아닌, 오직 개인만 접근할 수 있는 자원에 동시성 문제가 발생할리 만무하였다.
데이터 정합성은 아무 문제가 없었다.
문제상황 정정내용
단순 로직상의 이유에서 발생한 현상이였음.
likeRepository.deleteByUserid(likes.get().getUserid()) 코드로 문제해결함.
따라서, 동시성 문제가 생길법한 상황인 상품주문으로 인한 재고관리 부분에 더욱 집중하기로 하였다.
방법은 위와 같이 비관적 잠금을 시행할 예정이며, 추후 많은 접근이 일어날 경우 속도(성능)저하가 우려되니 이것도 타파할만한 기술에 대해 알아볼 예정이다.
항상 테스트를 하며 방심하지 말자는 것을 배우게 되었다.
가장 크게 배운 건, 동시성에 대해 더 알게 되었다는 것이다!
매우 귀중한 경험이였다.
'★ 프로젝트 + 트러블 슈팅 ★' 카테고리의 다른 글
Gradle build 오류처리 (0) | 2022.11.21 |
---|---|
동시성 제어문제 트러블슈팅 2 (0) | 2022.11.18 |
팀 협업프로젝트 회고 (0) | 2022.10.31 |
미니프로젝트 README (0) | 2022.10.26 |
그림장게시판_팀프로젝트_1주차 (0) | 2022.09.22 |
댓글