def accept_invitation(invitation_pk,user):
"""
초대 받은 친구가 초대를 수락합니다.
초대를 수락하면
Participants 테이블과 ChatParticipant 테이블에 해당 레코드 추가
"""
invitation = get_object_or_404(Invitation,pk=invitation_pk,status='pending')
invitation.status = 'accepted'
invitation.save()
chatroom_instance = invitation.chatroom
schedule_instance = chatroom_instance.schedule
Participants.objects.create(schedule=schedule_instance,participant__id=user.id)
ChatParticipant.objects.create(chatroom=chatroom_instance,user=user)
코드를 작성하고 나니
- Invitation의 상태 수정
- Participants 레코드 생성
- ChatParticipant 레코드 생성
3개의 작업이 원자적(atomic)으로 처리돼야 할 필요성이 있다고 느낌
from django.db import transaction
@staticmethod
def accept_invitation(invitation_pk, user):
with transaction.atomic():
invitation = get_object_or_404(Invitation, pk=invitation_pk, status='pending')
invitation.status = 'accepted'
invitation.save()
chatroom_instance = invitation.chatroom
schedule_instance = chatroom_instance.schedule
Participants.objects.create(schedule=schedule_instance, participant_id=user.id)
ChatParticipant.objects.create(chatroom=chatroom_instance, user=user)
트랜잭션 처리를 도입했기 때문에
세 작업 중 하나라도 실패할 경우,
전체가 롤백되어 데이터 정합성을 지킬 수 있음