댓글 삭제 로직에서 동시성 문제 발생 가능성
39
13 câu hỏi đã được viết
안녕하세요 쿠케님!
현재 구현되어 있는 댓글 삭제 로직을 보면
1. 댓글 조회
2-1. 자식 댓글이 존재하면 deleted=true 로 변경
2-2. 자식 댓글이 존재하지 않으면 댓글을 물리 삭제하고, 부모 댓글을 재귀적으로 삭제
이렇게 구현되어 있는데요. 동시성 문제가 발생할 수 있겠다는 생각이 들었습니다!
T1 삭제 트랜잭션 T2 답글 트랜잭션
────────────────────────────────────────────
SELECT 부모
SELECT 자식 → 없음
SELECT 부모 → ACTIVE
INSERT 답글
COMMIT
DELETE 부모
COMMIT(제가 잘 분석한게 맞나 모르겠네요 ㅎㅎ)
물론 이렇게 꼬일 확률은 낮지만, 이런 케이스에 대해서는 select for update를 거는 것이 좋을지, 아니면 fk를 추가하여 정합성을 보장해줘야 할지, 쿠케님 의견을 묻고 싶습니다.
Câu trả lời 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
105
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
120
3

