[Django] ORM 트랜잭션 정리

JinUk Lee·2024년 4월 15일
0

DRF 학습하기

목록 보기
50/57
post-custom-banner

트랜잭션

트랜잭션이란 DB에서 상태를 변화시키기 위해서 수행하는 작업의 단위를 말한다.

DB의 상태를 변화시킨다는건 SELECT, INSERT, DELETE, UPDATE 같은 쿼리 명령어를 사용한다는 것인데, 작업의 단위라고해서 해당 명령어를 사용하는 쿼리 한줄을 의미하는 것은 아니다.

예를 들어서, A가 B에게 계좌이체를 한다고 생각해보자.

이 계좌이체라는 행위는 A의 계좌에서 특정 금액만큼 빼서 B의 계좌에 더해주는 것인데, 이러한 행위가 쿼리로는

  1. 계좌목록에서 A계좌 선택
  2. A 계좌에서 금액 차감
  3. 계좌목록에서 B계좌 선택
  4. B 계좌에서 금액 차감

이렇게 여러 명령어가 필요하지만, 이러한 묶음이 연속되는 논리적인 작업 단위기 때문에 하나의 트랜잭션이라고 본다는 것이다.

ACID

이렇게 트랜잭션을 나눈 의미는 트랜잭션의 특징인 ACID를 배우면 알 수 있다.

트랜잭션의 특징은 아래처럼 4가지로 구분된다.

  • 원자성 (Atomicity)
  • 일관성 (Consistency)
  • 독립성 (Isolation)
  • 지속성 (Durability)

원자성

원자성은 트랜잭션이 DB에 모두 반영되던가, 반영되지 않아야 한다는 것이다. (연산이 모두 성공하거나 모두 실패해야한다)

계좌 이체를 하는데, A의 계좌에서 돈이 빠져 나가고 B의 계좌에서 그만큼 더해주려다가 에러가 발생했다고 생각해보자.

만약 이러한 상태에서 에러가 발생한 시점을 그대로 반영한다면 A의 계좌에서 금액만 줄어들어 전체 금액이 감소한 상태가 되기 때문에 논리적으로 오류가 발생한다.

따라서 이러한 경우에는 트랜잭션 작업 이전 시점으로 되돌리는데 이를 rollback 이라고 한다.

일관성

일관성은 트랜잭션의 결과가 기존 DB의 규칙을 만족하여 일관성있는 DB를 유지해야한다는 것이다.

예를 들어서 트랜잭션 이전에는 계좌 금액으로 500,000 이라는 숫자였는데 트랜잭션 이후로 갑자기 오십만원 이라는 문자로 변경되면 안된다는 것이다.

독립성

독립성은 트랜잭션은 다른 트랜잭션으로부터 독립되어야 한다는 것이다.

트랜잭션이 동시에 실행될 경우, 다른 트랜잭션의 연산에 영향받지 않아서 순차적으로 실행한 것과 같은 결과를 내야 한다.

그런데, 마냥 트랜잭션끼리 독립성을 강조하면 작업 효율에 문제가 생긴다.

그렇기때문에 독립성에 레벨을 두고 필요한 레벨만큼 조정해서 사용하는데 이를 고립화 수준 이라고 한다.

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATBLE READ
  • SERIALIZABLE

고렙화 수준은 이처럼 4가지 단계로 나누어져있으며 아래로 갈수록 고립화 수준이 높아지면서 데이터의 무결성을 보장하지만 성능이 떨어진다.

지속성(영속성)

지속성은 완료된 트랜잭션은 영구적으로 저장되어야한다는 것이다.

profile
개발자 지망생
post-custom-banner

0개의 댓글