Python/Django

[Django] 트랜잭션 이란? (Transaction.atomic)

yubi5050 2022. 6. 21. 00:46

트랜잭션이란?

트랜잭션(Transaction)이란 데이터베이스의 상태를 변경하는 작업의 단위를 의미

 

트랜잭션 작업이 정상적으로 완료되면 데이터베이스에 반영 (commit)

트랜잭션 중 일부 작업이 실패한다면 실행 전으로 되돌아감 (rollback)

 

트랜잭션은 크게 4가지의 성질을 가짐

  • 원자성 (Atomicity) : 트랜잭션 내용이 모두 반영되거나, 전부 취소되거나
  • 일관성 (Consistency) : 트랜잭션 수행 전과 수행 후의 상태가 같아야 함
  • 독립성 (Isolation) : 트랜잭션 진행 중 다른 트랜잭션에서 참조 불가
  • 지속성 (Durablility) : 완료된  트랜잭션의 결과는 시스템이 고장나도 영구적으로 반영되어야 함

 

예제 소스 코드 1. Decorator 방식

# User 수정
@transaction.atomic()
def patch(self, request):
    # Hobby parameters
    hobby_name = request.data.get("hobby_name",'')

    # User parameters
    email = request.data.get('email', '')
    password = request.data.get('password','')

    # UserProfile parameters
    nickname = request.data.get('nickname', '')

    # Hobby
    hobby_obj, is_hobby_obj = Hobby.objects.get_or_create(name = hobby_name)

    user = User.objects.filter(email=email)
    user.update(password=password)

    UserProfile.objects.filter(user=user[0]).update(
        user = user[0], nickname = nickname, hobby = hobby_obj, 
    )

    return Response({'message':'User 정보 수정 OK'}, status=status.HTTP_200_OK)

 

 

예제 소스 코드 2. with 구문 방식


with transaction.atomic():
	# Hobby
    hobby_obj, is_hobby_obj = Hobby.objects.get_or_create(name = hobby_name)

    user = User.objects.filter(email=email)
    user.update(password=password)

    UserProfile.objects.filter(user=user[0]).update(
        user = user[0], nickname = nickname, hobby = hobby_obj, 
    )