장고 프로젝트 회고 3 - 트랜잭션

김민정·2022년 6월 5일
0

장고 프로젝트1

목록 보기
3/4
with transaction.atomic():
                address = PresentDeliveryAddress.objects.create(
                    delivery_address         = delivery_address,
                    delivery_email           = delivery_email,
                    recipient                = recipient,
                    receive_phonenumber      = receive_phonenumber,
                    delivery_message         = delivery_message,
                )

                order = Order.objects.create(
                    user                     = user,
                    order_number             = uuid.uuid4(),
                    order_status             = OrderStatus.objects.get(status ="주문완료"),
                    present_delivery_address = address,
                    shopping_fee             = shopping_fee,
                    paymentmethod            = PaymentMethod.objects.get(id = paymentmethod)
                )

                for selected_cart_id in selected_cart_ids:
                    cart_item = Cart.objects.get(id = selected_cart_id)
                    OrderItem.objects.create(
                        order             = order,
                        option_product    = cart_item.option_product,
                        shipping_company  = "cj",
                        shipping_number   = uuid.uuid4(),
                        count             = cart_item.count,
                        order_item_status = OrderItemStatus.objects.get(item_status = "주문완료"),
                    )
                    cart_item.delete()
  1. 트랜잭션을 사용한 이유
    쇼핑몰의 경우 마지막 주문할때 많은 정보가 필요한데 주소도 따로 관리하고 주문 정보, 주문했던 아이템 정보도 따로 관리해야 한다. 만약 트랜잭션을 사용하지 않으면 주소는 등록되는 주문 아이템은 등록되지 않는 사고가 발생할 수 있다. 주소가 등록되고 주문도 되었는데 어떤 이유로 주문된 아이템이 저장되지 않는다면 이 주문은 다 취소되어야 한다. 트랜잭션이 필요하다

  2. 트랜잭션이란
    쪼갤 수 없는 업무 처리의 최소 단위를 이야기한다. 특히 db의존적이라는 이야기를 듣는 장고에서는 이런 개념이 더 중요해 보인다.

  3. 트랜잭션의 특징
    원자성, 일관성, 독립성, 지속성이 있다. 위의 사례로 이야기해본다.
    3-1) 원자성 - 트랜잭션이, 주소, 주문, 주문아이템 정보가, 데이터베이스에 모두 반영되거나 반영되지 않아야 한다. 이런 원자성이 깨진 경우( = 반영되지 않는다) 트랜잭션을 처음부터 다시 시작하거나, 트랜잭션의 부분적으로만 연산된 결과를 다시 취소시킨다(rollback의 개념)
    3-2) 지속성 - 위 동작이 성공적으로 완료됬을 경우, 결과는 영구적으로 반영되어야 한다.
    3-3) 독립성 - 위 동작이 진행되고 있을 떄 만약 다른 트랜잭션도 수행되고 있다면 이 둘 중 어떤 작업도 서로의 작업에 관여할 수 없다.
    3-4) 일관성 - 위 동작의 처리결과는 언제나 동일하다.

  4. 장고에서 트랜잭션 사용하기
    4-1)매우 간단하다고 할 수 있는 장고에서 트랜잭션 사용하기

from django.db import transaction
with transaction.atomic(): or
@transaction.atomic

데코레이터로 혹은 with로만 사용해도 된다고 하지만 custom? 할 경우를 생각해둔건지 생각보다 공식문서에는 많은 내용이 있었다. 하나씩 차근차근 정리 하기가 필요해보임

4-2)모든 뷰에 적용하고 싶다면

settings.py
 DATABASES = {
    'default':...{
    'ATOMIC_REQUESTS': True - 추가필요

모든 뷰에 적용하지 않고 특정 뷰에 적용하고 싶다면 4-1)
모든 뷰에 적용하되 특정 뷰에 적용하지 않기를 원한다면

@transaction.non_atomic_requests()

추가 필요

0개의 댓글