트랜잭션 처리

송용진·2025년 6월 23일

Python / Django

목록 보기
9/24

기존 방식

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)

코드를 작성하고 나니

  1. Invitation의 상태 수정
  2. Participants 레코드 생성
  3. 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)

트랜잭션 처리를 도입했기 때문에
세 작업 중 하나라도 실패할 경우,
전체가 롤백되어 데이터 정합성을 지킬 수 있음

profile
개발자

0개의 댓글