[파이썬][Django] 트랜잭션 관리 방법과 예제

Django에서 트랜잭션을 관리하는 방법과 예제를 살펴보겠습니다. 트랜잭션은 데이터베이스 작업을 논리적인 그룹으로 묶어서 원자성, 일관성, 고립성, 지속성 (ACID) 속성을 보장하는 데 사용됩니다.

트랜잭션 시작과 커밋

Django에서 트랜잭션을 시작하고 커밋하는 방법은 다음과 같습니다:

from django.db import transaction

# 트랜잭션 시작
@transaction.atomic
def my_view(request):
    # 트랜잭션 내에서 데이터베이스 작업 수행
    # ...

    # 트랜잭션 커밋 (변경사항 저장)
    # 만약 예외가 발생하면 자동으로 롤백됨

@transaction.atomic 데코레이터는 트랜잭션을 시작하고 뷰에서 예외가 발생할 경우 자동으로 롤백합니다.

트랜잭션 롤백

트랜잭션 롤백은 예외가 발생한 경우에도 수동으로 수행할 수 있습니다:

from django.db import transaction

@transaction.atomic
def my_view(request):
    try:
        # 트랜잭션 내에서 데이터베이스 작업 수행
        # ...

        # 예외 발생 시 롤백
        if something_went_wrong:
            raise Exception("Something went wrong")

        # 트랜잭션 커밋 (변경사항 저장)
    except Exception as e:
        # 트랜잭션 롤백
        transaction.set_rollback(True)
        # 예외 처리 또는 로깅

Savepoints (저장점)

Django에서는 Savepoints를 사용하여 트랜잭션 내에서 중첩된 트랜잭션을 만들 수 있습니다. 이것은 중첩된 트랜잭션에서 롤백할 때 유용합니다:

from django.db import transaction

@transaction.atomic
def my_view(request):
    # 트랜잭션 시작

    # 저장점 생성
    sid = transaction.savepoint()

    try:
        # 트랜잭션 내에서 데이터베이스 작업 수행
        # ...

        if something_went_wrong:
            # 중첩된 트랜잭션 롤백 (저장점으로 롤백)
            transaction.savepoint_rollback(sid)
            return HttpResponse("Something went wrong, and changes were rolled back.")
        
        # 중첩된 트랜잭션 커밋 (저장점 삭제)
        transaction.savepoint_commit(sid)

    except Exception as e:
        # 트랜잭션 롤백
        transaction.set_rollback(True)
        # 예외 처리 또는 로깅

이러한 방법을 사용하여 Django에서 트랜잭션을 시작, 커밋 및 롤백하는 방법을 이해할 수 있습니다. 이것은 데이터베이스 작업을 안전하게 관리하는 데 도움이 됩니다.