마이허니트립 | 예약 api transaction.atomic() 적용

2022. 8. 17. 21:08·wecode
반응형

bookings-passengers-tickets

유저가 예약을 하면 bookings에 레코드가 생성되고 

해당 예약에 해당되는 승객이 생기고

각 승객별로 티켓이 생성된다.

 

                booking = Booking.objects.create(
                    ...
                )

                passenger_list = [Passenger(
                    ...
                for passenger in passengers]

                Passenger.objects.bulk_create(passenger_list)

                [Ticket.objects.create(
                    ...
                for passenger in Passenger.objects.filter(booking_id = booking.id) for detail in flight_details]

 

그래서 순서대로 Booking, Passenger, Ticket객체를 생성하는데

이 과정은 하나의 트랜잭션이다. 그래서 예약-승객-티켓 생성이 전부 실행되거나 전부 실행되지 않아야 한다.

 

Passenger를 만드는 중간에 에러가 난다면 그전에 만들어졌던 Booking을 다시 없던걸로 되돌려야 하는데 장고에서 transaction을 지원해준다.

 

사용하기

from django.db import transaction

 

임포트를 해주고

 

with transaction.atomic():

 

트랜잭션을 이 아래 넣어준다.

그러면 중간에 에러가 발생해서 전체 트랜잭션이 실행되지 않으면

중간까지 실행됐던 작업이 롤백되어 원자성 유지가 가능하게 된다.

 

from django.db       import transaction

class BookingView(View):
    @check_access
    def post(self, request):
        try:
            with transaction.atomic():
                ...
         
                booking = Booking.objects.create(
                    ...
                )

                passenger_list = [Passenger(
                    ...
                for passenger in passengers]
                
                Passenger.objects.bulk_create(passenger_list)

                [Ticket.objects.create(
                    ...
                for passenger in Passenger.objects.filter(booking_id = booking.id) for detail in flight_details]

            return JsonResponse({'message' : 'SUCCESS'}, status = 200)
        except ...

 

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'wecode' 카테고리의 다른 글

마이허니트립 | 프로젝트 회고  (0) 2022.08.29
마이허니트립 | 예약목록 api : annotate를 이용한 정렬  (0) 2022.08.22
마이허니트립 | 예약페이지 승객정보 bulk_create  (0) 2022.08.14
마이허니트립 | 예약상태 지정에 Enum사용하기  (0) 2022.08.07
마이허니트립 | 카카오 로그인 api : 카카오 인가코드로 토큰발급받기  (0) 2022.08.05
'wecode' 카테고리의 다른 글
  • 마이허니트립 | 프로젝트 회고
  • 마이허니트립 | 예약목록 api : annotate를 이용한 정렬
  • 마이허니트립 | 예약페이지 승객정보 bulk_create
  • 마이허니트립 | 예약상태 지정에 Enum사용하기
이라후
이라후
  • 이라후
    화이팅
    이라후
  • 전체
    오늘
    어제
    • 분류 전체보기 (133)
      • TIL (23)
      • 기타 (26)
      • Python (14)
      • Django (10)
      • JavaScript (8)
      • git & GitHub (8)
      • Web (10)
      • Go (3)
      • wecode (31)
  • 반응형
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
이라후
마이허니트립 | 예약 api transaction.atomic() 적용
상단으로

티스토리툴바