Transaction이란?
트랜잭션(Transaction) 이란, 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위이다.
Transaction의 특징
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)