게시물 수정 시 경합 상태(Race Condition) 발생 가능성

문제

위키 페이지에 대한 동시 편집은 예상치 못한 동작을 유발할 수 있습니다. 제 경우, 두 게시물 간의 quoted_posts 관계가 잘못 설정됩니다.

이것은 quoted_posts가 사용될 때 다른 문제를 일으킬 수 있습니다. 예를 들어 User#refresh_avatar에서 quoted_posts가 누락되면 모든 인용 게시물을 다시 생성(rebake)할 수 없게 됩니다.

가능한 원인

이 커밋에서 도입된 경고는 게시물의 동시 편집을 방지하기에 충분하지 않습니다. 이는 체크가 원자적(atomic)이지 않기 때문입니다. 이는 드문 상황이지만 여전히 발생할 수 있습니다.

PostRevisor#revise!는 QuotedPost.extract_from(@post)를 호출하며, 게시물에 인용이 하나도 없으면 모든 quoted_posts를 삭제합니다. 두 개의 편집이 동시에 PostRevisor#revise!를 호출할 때, 하나는 인용 게시물을 추가하고 다른 하나는 인용 게시물을 추가하는 경우, 게시물 내용은 인용이 있는 편집으로 끝나고 quoted_post 관계는 인용이 없는 편집에 의해 파괴될 수 있습니다.

가능한 해결책

게시물을 편집할 때 Redis 락을 획득하는 것을 고려해야 할 것입니다.

3개의 좋아요

가능할 것 같고, 여기에 분산 락을 추가하는 것에 대해 크게 반대하지는 않습니다. 다만, 데드락을 일으킬 위험이 있으므로 매우 주의해야 합니다.

동시 편집이 정말로 필요하시다면, 공유 편집을 사용해 보시는 건 어떨까요?

3개의 좋아요