Transaction의 중요성

suji·2024년 3월 7일
post-thumbnail

개발을 하면서 create, delete 메소드에 주로 사용하긴 했지만
정확히 transaction은 어떻게 동작하는지, 왜 중요한지 짚고 넘어가지 못했던 것 같아 정리를 해보고자 한다.

Transaction 이란?

먼저 트랜잭션이란?

  • 하나의 논리적 기능을 수행하기 위한 작업 단위
  • 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위
  • 데이터베이스의 무결성을 지킬 수 있는 좋은 방법중 하나

흔히들 은행 계좌의 입출금으로 예시를 드는데, 다수의 요청이 데이터베이스를 동시에 접근하더라도 일관성을 유지시켜야 하는 것이 중요하다.


A 계좌에서 B 계좌로 송금을 한다고 생각해보자.
먼저 A계좌에서 10만원을 차감한 다음, B계좌에 10만원을 입금하는 절차를 거친다.
만약 A계좌에서 10만원이 차감되고, 오류가 발생한다면? B계좌는 입금받지 못하고 A계좌에서 출금만 되는 아찔한 상황이 일어날 것이다.

트랜잭션을 사용하면 이런 문제를 해결할 수 있다.
시스템 오류를 감지하고, A계좌에서 차감되었던 10만원을 다시 돌려놓는 것이다.
이러한 트랜잭션은 다양한 데이터 항목들을 엑세스하고 갱신하는 프로그램 수행의 단위가 된다.

모든 작업이 정상적으로 성공하는 경우 데이터베이스에 정상 반영하는 것을 Commit이라고 하며,
작업 중 하나라도 실패해서 이전으로 되돌리는 것을 Rollback이라고 한다.

ACID 속성

ACID는 트랜잭션의 네 가지 기본 속성을 나타내는 약어이다.
이 속성들은 데이터베이스 시스템이 안정성과 일관성을 유지하는 데 중요한 역할을 한다.

  1. 원자성(Atomicity)
    : 더 이상 쪼개질 수 없는 원자와 같은 성질을 말한다.
  • 트랜잭션은 원자 단위로 처리되어야 한다.
  • 트랜잭션 중간에 오류가 발생하면, 트랜잭션의 모든 작업은 취소되어야 한다.
  • 트랜잭션은 성공 또는 실패로 완결되며 중간 상태는 허용되지 않는다
  1. 일관성(Consistency)
  • 트랜잭션이 실행 전과 실행 후에 데이터베이스는 일관된 상태를 유지해야 한다.
  • 트랜잭션 수행 전과 후에 정의된 비지니스 규칙과 제약 조건은 항상 만족되어야 한다.
  1. 고립성(Isolation)
  • 여러 트랜잭션이 동시에 실행되는 경우, 각 트랜잭션은 다른 트랜잭션의 작업에 영향을 받지 않아야 한다.
  • 트랜잭션은 독립적으로 수행되어야 하며, 하나의 트랜잭션이 다른 트랜잭션의 내용을 볼 수 없어야 한다.
  1. 지속성(Durability)
  • 트랜잭션이 성공적으로 완료되면, 해당 트랜잭션에서 수행한 변경 사항은 영구적으로 저장되어야 한다.
  • 시스템 장애 또는 기타 문제가 발생하더라도 트랜잭션의 결과는 영구적으로 유지되어야 한다.

이 네가지 속성을 입출금 예시에 빗대어 간단하게 이해해 보자면,

  • 입출금은 성공 또는 실패의 경우만 있고 중간 상태는 없이 실행되어야 한다.
  • 입출금 전과 후에 데이터베이스는 일관된 상태를 유지해야 한다.
  • 한 계좌에 여러 입출금 행위가 이루어질 경우, 각 작업별로 이루어져야 하며 영향받지 않아야 한다.
  • 입출금이 성공할 경우 변경 사항은 영구적으로 저장되어야 하며, 실패할 경우도 계좌는 유지되어야 한다.

트랜잭션의 중요성

이와 같이 트랜잭션은 데이터의 원자성, 일관성, 고립성, 지속성을 가능하게 하는 데이터베이스 시스템의 중요한 기능이다.
따라서 트랜잭션은 높은 수준의 데이터 무결성이 필요한 비지니스 트랜잭션에 중요하다.
특히 전자 상거래, 금융 시스템과 같이 데이터 오류의 결과가 심각한 영향을 끼칠 수 있는 서비스의 데이터의 신뢰성과 무결성을 보장하는 데 중요한 역할을 한다.

그러나,,
안전하고 일관된 데이터베이스의 상태를 유지하는데 도움을 주지만, 트랜잭션에 따른 여러가지 문제점들도 발생할 수 있는데
이를 방지하기 위해 적절한 설계와 구현으로 트랜잭션을 잘 사용해야 한다.

다음에는 Go언어로 트랜잭션 기능을 사용하는 글을 이어 써보려고 한다.


참고자료
트랜잭션(Transaction) 이란?
DBMS는 어떻게 트랜잭션을 관리할까?

profile
문제를 해결하는 백엔드 개발자

0개의 댓글