transaction(트랜잭션)

samdaso-o·2021년 8월 12일
1

Django

목록 보기
9/9

위코드에서 1차 프로젝트를 진행하면서 어제 새롭게 알게된 트랜잭션에 대해 기술해보겠다.

일단 이 모듈을 사용하게된 이유는 이번 1차 프로젝트에서 리뷰를 작성할때 사용할 테이블을 리뷰테이블과 리뷰이미지테이블로 나누었다. 그래서 작성한 리뷰를 생성하거나 수정할 때 테이블을 각각 하나씩 create 또는 update를 해주었어야 했는데, 이때 문제가 생겼다.
리뷰테이블만 값이들어와 리뷰테이블만 생성되고 리뷰이미지테이블은 생성되지 않는 오류가 발생한 것이다.
그래서 사용하게 된게 트랜잭션이다.

transaction(트랜잭션)이란?
여러 프로세스가 묶여져 마치 하나처럼 동작하는 방식이라고 생각하면 된다.
쉽게 말해 정해진 기술한 코드들이 전부 동작해야 성공 또는 실패하게 하는 것, 둘 중 하나라도 실패한다면 다시 롤백이 되는것이라고 생각하면 된다.

트랜잭션을 적용시키는 방법은 여러가지가 있다.
일단 항상 import 해오는 것을 잊지 말기!

from django.db import transaction

데코레이터를 이용해 트랜잭션을 동작하는 방법
이 데코레이터를 사용하게 되면, 메서드안에서 코드를 따로 삽입할 필요가 없다. 첫번째 update를 수행하고 두번째 update에서 업데이트에 실패를 하게 된다면, 첫번째 update는 없었던 일로 되고 한마디로 롤백이 된다.

2.
with 명령어를 이용한 트랜잭션
메서드 전체가 아닌 일부만 트랜잭션으로 묶어줘야하는 경우가 있다.
그럴땐 아래의 함수를 사용하면 된다.

with transaction.atomic()

3.
savepoint를 직접 지정해 주는 트랜잭션
1,2번의 경우는 매서드내에서 문제가 생기면 자동으로 롤백이 된다. 그래서 예외처리가 필요가 없다.
하지만 위의 코드를 예시로 첫번째 함수는 실행되었는데 두번째 함수가 안된다고 해도 첫번째는 저장이 되버린다.
그러므로 다른 함수를 선언해 첫번째 함수와 두번째 함수를 묶어주어 transaction을 선언해주면 된다.

-추가
혹시나 class_view에 transaction을 선언하였는데 존재하는 함수중 제외하고 싶은것이 있다면,

@transaction.non_atomic_requests

이 데코레이터를 사용하면 된다.

profile
ㅎㅅㅎ

1개의 댓글

comment-user-thumbnail
2021년 8월 14일

머리에 쏙쏙 들어오네요!! 감사합니다

답글 달기