[파이썬][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에서 트랜잭션을 시작, 커밋 및 롤백하는 방법을 이해할 수 있습니다. 이것은 데이터베이스 작업을 안전하게 관리하는 데 도움이 됩니다.