댓글 삭제 로직에서 동시성 문제 발생 가능성
39
작성한 질문수 13
안녕하세요 쿠케님!
현재 구현되어 있는 댓글 삭제 로직을 보면
1. 댓글 조회
2-1. 자식 댓글이 존재하면 deleted=true 로 변경
2-2. 자식 댓글이 존재하지 않으면 댓글을 물리 삭제하고, 부모 댓글을 재귀적으로 삭제
이렇게 구현되어 있는데요. 동시성 문제가 발생할 수 있겠다는 생각이 들었습니다!
T1 삭제 트랜잭션 T2 답글 트랜잭션
────────────────────────────────────────────
SELECT 부모
SELECT 자식 → 없음
SELECT 부모 → ACTIVE
INSERT 답글
COMMIT
DELETE 부모
COMMIT(제가 잘 분석한게 맞나 모르겠네요 ㅎㅎ)
물론 이렇게 꼬일 확률은 낮지만, 이런 케이스에 대해서는 select for update를 거는 것이 좋을지, 아니면 fk를 추가하여 정합성을 보장해줘야 할지, 쿠케님 의견을 묻고 싶습니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. bebe님.
댓글 삭제 로직에서 동시성 문제 가능성을 고려한 분석이 매우 뛰어납니다. 많은 댓글 시스템에서는 동시 삭제와 작성 작업이 발생할 수 있기 때문에 이러한 문제를 예상하고 대비하는 것이 중요합니다.
문제 분석
위와 같은 시나리오에서는 부모 댓글이 삭제된 상태에서 자식 댓글이 추가되는 비정상적인 상태가 발생할 수 있습니다. 이는 실제 응용 분야에서 데이터 정합성에 문제를 야기할 수 있습니다.
해결 방안
Select FOR UPDATE:
- 데이터 정합성을 높이기 위해 삭제 연산 시 자식 댓글이 존재하는지 여부를 확인할 때
SELECT ... FOR UPDATE를 사용하여 레코드를 잠궈 다른 트랜잭션이 영향을 미치지 않도록 할 수 있습니다. 이는 트랜잭션 단위에서 수정 가능성을 막으며, 일정 부분 성능 저하가 있음을 유의해야 합니다.
- 데이터 정합성을 높이기 위해 삭제 연산 시 자식 댓글이 존재하는지 여부를 확인할 때
Foreign Key Constraint:
- 데이터베이스 수준에서 아예 부모와 자식 간의 참조 무결성을 설정하는 방법도 있습니다. 부모 삭제 시 자식이 있는 경우 처리되지 않거나, 또는
ON DELETE CASCADE옵션을 통해 자식을 함께 삭제하는 방식으로 데이터 정합성을 확보할 수 있습니다.
- 데이터베이스 수준에서 아예 부모와 자식 간의 참조 무결성을 설정하는 방법도 있습니다. 부모 삭제 시 자식이 있는 경우 처리되지 않거나, 또는
Application Layer에서의 추가 로직:
- 애플리케이션 레벨에서 부모 삭제 전에 자식 댓글이 생성되는 상황을 방지하기 위한 추가적인 검사를 두는 것도 방법입니다.
- 애플리케이션 레벨에서 부모 삭제 전에 자식 댓글이 생성되는 상황을 방지하기 위한 추가적인 검사를 두는 것도 방법입니다.
각 방법은 환경과 성능 요구에 따라 평가되어야 합니다. 트랜잭션 락을 활용하면 효율적인 동시성 제어가 가능합니다. 반면, 외래 키를 활용하면 데이터베이스 무결성을 자연스럽게 확보할 수 있습니다.
유사한 문제 해결을 위한 추가 정보는 다음 링크에서 확인하실 수 있습니다:
- 댓글 삭제 시 동시성 문제 고려해야 하는 케이스 및 해결 방안 (게시글 제목)
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
ArticleReadService 관련 질문
0
31
1
조건 검색 질문
0
40
1
무한 depth 구현 중 CommentPath 관련 질문
0
55
1
테스트 코드 작성 시 DTO 새로 작성하는 이유가 궁금합니다.
0
74
1
Kafka Cluster 구성도 질문
0
57
1
@Version 어노테이션이 붙은 필드는 낙관적 락이든 비관적 락이든 업데이트가 됩니다.
0
95
1
consumer에서 에러가 발생할 경우 데이터 유실 문의
0
104
2
게시글 테스트 데이터 삽입
0
87
2
정렬, 필터, 검색 등의 조건이 붙을 경우 최적화할 수 있는 방법이 무엇이 있을까요?
0
154
2
좋아요 기능 정합성 보장 방법
0
139
2
좋아요 동시성처리 최적의 선택?
1
187
2
프론트엔드 msa 환경 api 주소 통합? 과 서버끼리 통신 방식에대해
0
132
2
안녕하세요 무한스크롤 강의듣다가 질문이 있습니다.
0
90
1
조회수 조회 로직 질문
1
106
2
비로그인 유저도 어뷰징 방지 정책
1
122
2
CommentServiceTest의 테스트 로직 질문
0
77
2
무한 스크롤 방식에서 페이지 번호 방식 쿼리의 문제점 의문
1
106
2
path 쿼리 관련 질문드립니다!
0
96
2
antigravity 에디터를 쓰신다면 종료해주세요
1
146
0
프로젝트 구조
0
118
2
article_like_count api test
0
108
2
이벤트 페이로드 객체의 생성 방식이 팩토리 메서드 패턴이 아닌 빌더 패턴인 이유가 궁금합니다!.
0
128
2
[33. 좋아요 수 구현] 에서 테스트 하는 화면 동시성 문제
0
129
2
findByPath에서 articleId로도 검색을 해야 할 것 같아요.
0
119
3





