Django에서의 Transactions

Django에서의 Transactions

트랜잭션(Transaction)이란?

트랜잭션은 데이터베이스에서 한 번에 수행되어야 할 일련의 연산들을 의미합니다. 트랜잭션은 아래의 4가지 속성을 가져야 합니다.

1. 원자성 (Atomicity)

트랜잭션의 모든 연산은 완전히 수행되거나, 아니면 전혀 수행되지 않아야 합니다. 연산 중 하나라도 실패하면 전체 트랜잭션은 취소되어야 하며, 모든 변경 사항이 롤백되어야 합니다.

예)
a가 b에게 100만 원을 이체하려고 할 때 a계좌에서 100만 원 차감 후 시스템 오류로 b계좌에 입금을 실패하면 돈은 사라지게 됩니다. 그래서 이를 오류 발생 시 전체 연산을 취소(롤백)하는 트랜잭션으로 해결할 수 있습니다.

2. 일관성 (Consistency)

트랜잭션이 성공적으로 완료되면 데이터베이스는 언제나 일관된 상태로 유지되어야 합니다.

예)
온라인 쇼핑몰에서 재고가 0이 되면 판매를 중지 해야 하기에,
제품 판매 후 재고 감소 처리를 원자적으로 수행하고, 재고가 0일 경우 판매를 중지하면서 재고와 판매 상태의 일관성을 유지해야 합니다.

3. 고립성 (Isolation)

하나의 트랜잭션이 실행되는 동안, 다른 트랜잭션의 연산은 이 트랜잭션에 영향을 주어서는 안 됩니다.

예)
경매 시스템에서 각 입찰을 독립된 트랜잭션으로 처리해야 합니다. 그래서 동시에 여러 사람이 입찰해도 서로에게 영향을 미치면 안 됩니다.

4. 지속성 (Durability)

트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 데이터베이스에 저장되어야 합니다.

예)
만약 고객이 항공편 좌석을 예약하고 결제에 성공하면, 시스템에 장애가 발생하더라도 데이터베이스에 영구적으로 저장해야 합니다. 이러한 장애 상황 후에도 고객의 예약 정보를 유지해야 합니다.

이러한 원자성, 일관성, 고립성 및 지속성을 보장함으로써 데이터의 정확성과 안정성을 유지하고, 동시에 여러 사용자가 동시에 데이터에 액세스 할 수 있게 해 줍니다.

Django에서 트랜잭션 사용하기

1. transaction.atomic 데코레이터 사용

transaction.atomic 데코레이터를 사용하면 특정 함수 또는 메서드의 실행을 원자적으로 만들 수 있습니다.

from django.db import transaction

@transaction.atomic
def my_view(request):
    # 이 함수 내의 데이터베이스 연산은 원자성을 가집니다.
2. transaction.atomic 컨텍스트 관리자 사용

컨텍스트 관리자를 사용하면 with 문 내에서만 원자성을 갖는 연산을 수행할 수 있습니다.

from django.db import transaction

with transaction.atomic():
    # 이 코드 블록 내의 데이터베이스 연산은 원자성을 가집니다.
3. 수동으로 커밋 및 롤백 관리

Django에서는 수동으로 트랜잭션을 관리할 수 있는 방법도 제공합니다. transaction.set_autocommit를 사용하면 자동 커밋을 비활성화할 수 있으며, transaction.committransaction.rollback을 사용하여 트랜잭션을 직접 관리할 수 있습니다.

from django.db import transaction

transaction.set_autocommit(False)
try:
    # 여기에 연산 코드를 작성
    transaction.commit()
except:
    transaction.rollback()
finally:
    transaction.set_autocommit(True)
4. transaction.on_commit 사용

이 방법은 트랜잭션이 성공적으로 커밋된 후에만 특정 코드를 실행하고 싶을 때 사용합니다.

from django.db import transaction

def something_to_do():
    # 커밋 후에 실행할 작업
    pass

with transaction.atomic():
    # 데이터베이스 연산
    transaction.on_commit(something_to_do)

이러한 다양한 방법을 통해 Django에서 트랜잭션을 효과적으로 관리하고 원하는 동작을 구현할 수 있습니다.

'Python > Django' 카테고리의 다른 글

Django 소유자 여부 확인(DRF)  (0) 2023.08.28
Serializer에서 method 사용하기  (0) 2023.08.27
values_list()  (0) 2023.08.09
annotate() 메서드와 가변 키워드 인자  (0) 2023.07.25
django에서 *args, **kwargs  (0) 2023.07.25