Django - Transaction을 사용해 보자

김우식·2022년 6월 26일
0

Transaction이란?

트랜잭션(Transaction) 이란, 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위이다.

Transaction의 특징

  1. 원자성
    원자성(atomicity)은 하나의 트랜잭션이 더 이상 작게 쪼갤 수 없는 최소한의 업무 단위이다.
  2. 일관성
    일관성(consistency)은 트랜잭션이 완료된 결괏값이 일관적인 DB 상태를 유지하는 것을 말한다.
  3. 고립성
    고립성(isolation)이란 하나의 트랜잭션 수행시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장하는 것이다.
  4. 지속성
    트랜잭션이 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 저장되어야 한다.

Transaction의 Commit과 Rollback

Commit
하나의 트랜잭션이 성공적으로 끝나서 데이터베이스가 일관성있는 상태에 있음을 의미한다.

Rollback
트랜잭션의 원자성이 깨질 때, 즉 하나의 트랜잭션 처리가 비정상적으로 종료 되었을 때의 상태를 뜻한다.
Rollback 이 이뤄진다면 트랜잭션을 다시 실행하거나 부분적으로 변경된 결과를 취소할 수 있다.

Transaction 실제로 사용해보기

    @login_decorator
    def post(self, request):
        try:
            data    = json.loads(request.body)

            user    = request.user

            product = Product.objects.get(id = data['product_id'])
            color   = Color.objects.get(id = data['color_id'])
            size    = Size.objects.get(id = data['size_id'])

            Product_option_created = ProductOption.objects.create(
              product_id = product.id,
              color_id   = color.id,
              size_id    = size.id
            )

            Cart.objects.create(
                user_id           = user.id,
                product_option_id = product_option_created.id
            )

            return JsonResponse({"message": "CART_CREATE_SUCCESS"}, status=201)

        except KeyError:
            return JsonResponse({"message" : "KEYERROR"}, status = 400)

transaction을 적용시키기 전의 코드이다.
코드를 보면 create를 2번 실행시키게 되어있는데, 이 경우 서버 혹은 무엇인가의 에러가 발생하게 되어, 끝까지 진행되지 못할때 문제가 발생할 수 있다.

    @login_decorator
    @transaction.atomic
    def post(self, request):
        try:
            data    = json.loads(request.body)

            user    = request.user

데코레이터를 이용해 @transaction.atomic을 함수에 적용시켜주면, 함수를 transaction 처리해줄 수 있다.
그런데, 나는 좀 더 세부적인 내용에 transaction를 해주고 싶었기 때문에, 방법을 조금 더 찾아보았다.

 with transaction.atomic():
	product_option_created = ProductOption.objects.create(
		product_id = product.id,
        color_id   = color.id,
        size_id    = size.id
	)

	Cart.objects.create(
		user_id           = user.id,
		product_option_id = product_option_created.id
	)

with transaction.atomic():을 이용하여 함수내부의 일부만 transaction 처리를 해보았다. 이제 예외처리를 해보자.

except IntegrityError:
	return JsonResponse({"message": "TRANSACTION_ERROR"}, status=400)
profile
반가워요!

0개의 댓글