본문 바로가기
python/Django

Django transaction atomic

by Redking

Django 는 기본적으로 데이터베이스 트랜잭션을 관리하는 몇가지 방법을 제공하지만 Django가 auto-commit-mode에서 실행되기 때문에 개발자가 사용하는 각각의 쿼리는 데이터베이스에 직접 커밋됩니다.

 

Transaction 은 데이터베이스 쿼리의 원자 집합입니다. 이 함수는 데이터베이스 명을 인수로 사용하며, 제공되지 않는 경우 기본 데이터베이스를 사용하게 됩니다. Django는 atomic()블록이 활성화 되면 원자성이 손상되기 때문에 커밋 or 롤백을 거부하게 됩니다.

 

Django는 데이터베이스 트랜잭션을 제어하는 하나의 API를 제공하며 atomic을 사용하면 데이터베이스의 원자성이 보장되는 코드를 만들 수 있습니다. auto-commit-mode에서 활성 트랜잭션이 없으면 각 쿼리는 자체 트랜잭션으로 래핑됩니다. 각 쿼리는 트랜잭션을 시작할 뿐만 아니라 쿼리의 성공 여부에 따라 트랜잭션도 자동으로 커밋되거나 롤백됩니다.

 

atomic()을 사용하여 트랜잭션 블록을 작성할 때 염두에 두어야 할 몇 가지 사항이 있습니다.

 

1. 트랜잭션 블록에 try, catch 사용 하지 않기.

raise, error가 발생하면 전체 블록을 실행하지 못합니다.

 

2. select_for_update 메서드를 사용하여 쿼리를 업데이트합니다.

기본적으로 select_for_update ()는 트랜잭션이 완료될 때까지 쿼리에 의해 선택된 모든 row를 잠급니다. 예를 들어, select_related()에 지정된 관련 객체의 row는 트랜잭션에 의해 잠깁니다.

 

데코레이터로 사용하기

from django.db import transaction
  @transaction.atomic
  def viewfunc(request):
    # This code executes inside a transaction.
    do_stuff()

컨텍스트로 사용하기

from django.db import transaction
  def viewfunc(request):
  # This code executes in autocommit mode (Django's default).
  do_stuff()
    with transaction.atomic():
    # This code executes inside a transaction.
      do_more_stuff()

간단 요약

  • Transaction의 모든 연산은 반드시 한꺼번에 완료가 되어야 하며, 그렇지 않은 경우에는 한꺼번에 취소되어야 하는 원자성을 가지고 있다.
  • 정상적으로 완료가 되어서, 성공적으로 종료 -> COMMIT
    • 데이터베이스에 반영
  • 취소 혹은 비정상 적인 종료 -> ROLLBACK
    • 데이터베이스에 영향 없음

댓글