[TIL]Django Transaction

minhyuk_ko·2021년 12월 12일
0

Wecode

목록 보기
29/33

Transaction :

데이터베이스 내에서 한꺼번에 수행되어야할 일련의 연산
전부 실행되거나, 혹은 전부 실행이 안되야 한다.
Transaction Example: 송금과 입금 (돈을 송금했는데 입금이 안된다면 큰 문제가 생긴다!)

위와 같이 여러 과정을 하나의 과정으로 취급하는 방식
과정중 하나의 프로세스가 안되면 전체 프로세스가 안되는 원자성을 띄고 있다.

모든 과정이 통과하면 : COMMIT
과정 중 비정상 종료 및 취소 : ROLLBACK

데이터베이스적 측면에서 확인하면 transaction 작업중 실패하면 데이터에 반영되지 않는다.
반대로 transaction 작업이 성공하면 모든 작업으로 발생한 데이터의 변화가 반영된다.

사용법
Django 프로젝트 안에 settings.py 에서 ATOMIC_REQUESTS = True 라고 세팅해준다.

  • 데코레이터를 사용한 transaction 사용
  • from django.db import transaction
    
    @transaction.atomic
    def test(*args):
    	# transaction start point 
    	test1.save()
        	test2.save()
            test3.save()
            # transaction end point

    데코레이터를 사용하여 위와 같이 작성한다면 모든 save메서드에 transaction이 적용된다.

  • with 을 사용한 transaction 사용
  • from django.db import transaction
    
    def test(*args):
    	# test1, test2 는 transaction 적용X
    	test1.save()
        	test2.save()
            # transaction start point 
            with transaction.atomic():
            	test3.save()
                	test4.save()
                    # transaction end point
    

    함수 내에서 따로 transaction 구간을 두어 처리하는 방법이다.

  • try 와 except를 사용한 transaction 사용
  • from django.db import transaction
    
    def test(*args):
        	test1.save()
            trans_point = transaction.savepoint()
            
            # transaction start point 
            try:
            	test2.save()
                	test3.save()
                    transaction.savepoint__commit(trans_point)
            	# transaction end point
            
            # transaction 과정중 오류발생시
            except transaction.TransactionManagementError:
            	transaction.savepoint__rollback(trans_point)

    savepoint를 만들어 rollback 하는 시점을 정하고 transaction오류가 발생시 TransactionManagementError가 발생하여 예외처리를 rollback 하는 것으로 작성하였다.

    잡담 : Django 웹 프레임워크에서 transaction 기능을 지원해주는 것에 감사함을 느낀다. 다른 웹 프레임워크 사용하면 transaction 과정들을 직접 적어야한다니..

    profile
    BE Developer

    0개의 댓글