Transaction

초코바나나탕수육·2021년 12월 12일
0
post-thumbnail

사이트 클론코딩 프로젝트를 진행하며 새롭게 알게 된 개념인 transaction(트랜잭션)에 대해 소개해보는 시간을 가져보겠습니다.

트랜잭션은 이해하면 어려운 개념까진 아니라고 생각한다. (자세히 알려면 아직 갈길이 멀지만) 쉽게 말해서 여러개의 프로세스를 하나로 묶어서 동작할 수 있게 만들어 주는 것인데
예를 들면 내 계좌에 있는 10,000원을 누군가의 계좌로 송금하는 상황이 있다고 가정해보자. 내 계좌에서 만원이 빠져나가고 상대방의 계좌로 가는 도중에 예기치 못한 사고가 발생하여 중단이 된다면? 내 만원은 말그대로 증발하고 말 것이다.
하지만 트랜잭션을 통해 하나의 프로세스로 묶어서 진행한다면 그러한 상황이 발생하여도 시작하기전으로 rollback 하기에 안전하다고 할 수 있다.

내가 공부하는 django에서도 transaction 기능을 제공하는데, 사용법을 알아보자. 크게 3가지로 나눌 수 있다.

1. 데코레이터를 이용한 transaction

transaction을 사용하기 가장 편한 방법은 데코레이터를 이용하는 법이다.

from django.db import transaction

@transaction.atomic
def test1(arg1, arg2):
	a.save()
    
    b.save()

위와 같이 @transaction.atomic 이라는 데코레이터만 붙여주면 사용할 수 있다. 메소드 안에 코드를 쓸 필요가 없기 때문에 아주 유용하다.

2. with 명령어를 이용한 transaction

from django.db import transaction

def test2(arg,1 arg2):
	a.save()
    
    with transaction.atomic():
    	b.save()
        
        c.save()

메소드 전체가 아닌 일부분만 묶어주고 싶을 때에는 with명령어를 통해 사용할 수 있다.

3. savepoint를 직접 지정

from django.db import transaction

def test3(arg1, arg2):
	a.save()
    
    sid = transaction.savepoint()
    
    try:
    	b.save()
        
        c.save()
        
        transaction.savepoint_commit(sid)
        
    except Exception
    	transaction.savepoint_rollback(sid)

위의 두가지 (1,2번) 방식은 메소드 내에서 exception이 발생해도 저절로 rollback이 가능하기 때문에 예외처리를 따로 해줄 필요가 없다. 하지만 3번의 경우에는 그렇지 않기 때문에 savepoint와 commit을 설정해줘야하기 때문에 예외처리도 따로 해주어야한다.

0개의 댓글