본문 바로가기
IT

[DB] 트랜잭션(Transaction)이란? (개념, 특징, @Transactional)

by 유나니나노 2024. 4. 12.
반응형

 

트랜잭션(Transaction)은 데이터베이스 관리 시스템(DBMS)에서 매우 중요한 개념입니다. 데이터의 일관성과 무결성을 유지하기 위해 사용되며, 여러 데이터베이스 작업을 하나의 작업 단위로 묶어서 처리하는 기능을 말합니다. 트랜잭션을 통해 여러 작업이 모두 성공적으로 완료되거나, 하나라도 실패할 경우 모두 취소되어 원래 상태로 복구되는 것을 보장합니다.

 

특징

트랜잭션의 ACID 속성은 데이터베이스 관리 시스템(DBMS)에서 데이터의 정확성과 일관성을 보장하기 위한 핵심적인 원칙입니다. ACID는 원자성, 일관성, 독립성, 지속성의 약자로 각각의 속성은 트랜잭션이 안정적으로 실행되도록 보장합니다.

  • 원자성(Atomicity)
    •  원자성은 트랜잭션 내의 모든 연산이 완전히 수행되거나 전혀 수행되지 않아야 함을 의미합니다. 즉, 트랜잭션 내의 연산이 부분적으로만 실행되는 경우는 허용되지 않습니다. 이를 위해 데이터베이스 시스템은 트랜잭션의 모든 연산을 성공적으로 완료하거나, 실패 시 모든 연산을 원래 상태로 되돌리는 롤백 기능을 제공합니다. 예를 들어, 계좌 이체 과정에서 금액을 출금하는 연산은 입금하는 연산과 함께 원자적으로 처리되어야 합니다.
  • 일관성(Consistency)
    • 일관성은 트랜잭션이 실행되기 전과 후에 데이터베이스가 일관된 상태를 유지해야 함을 의미합니다. 트랜잭션은 데이터베이스의 무결성 제약 조건을 위반하지 않고, 데이터베이스의 상태를 한 유효한 상태에서 다른 유효한 상태로 변환해야 합니다. 예를 들어, 계좌 이체 시 잔액이 음수가 되지 않도록 하는 등의 제약 조건을 만족시켜야 합니다.
  • 독립성(Isolation)
    • 독립성은 트랜잭션이 동시에 실행되고 있을 때, 각 트랜잭션이 서로의 중간 상태를 볼 수 없도록 함으로써 각각 독립적으로 실행되게 하는 속성입니다. 이는 동시성 제어를 통해 구현되며, 데이터베이스 시스템은 다른 트랜잭션의 중간 결과에 영향을 받지 않도록 격리 수준을 제공합니다.
  • 지속성(Durability)
    • 지속성은 트랜잭션이 성공적으로 완료된 후, 그 결과가 영구적으로 데이터베이스에 반영되어야 함을 의미합니다. 시스템에 장애가 발생하더라도, 완료된 트랜잭션의 결과는 보존되어야 합니다. 이를 위해 데이터베이스 시스템은 로깅과 같은 기술을 사용하여 트랜잭션의 결과를 안전하게 저장합니다.

@Transactional

Spring Framework에서 @Transactional 어노테이션은 선언적 트랜잭션 관리를 제공합니다. 이를 통해 개발자는 비즈니스 로직에 집중할 수 있으며, 트랜잭션 관리는 Spring이 알아서 처리하게 됩니다. @Transactional을 사용하면 메서드 실행을 트랜잭션 경계로 정의할 수 있으며, 해당 메서드가 실행되는 동안 발생하는 모든 데이터베이스 연산을 하나의 트랜잭션으로 묶을 수 있습니다.

특징

  • 선언적 트랜잭션 관리: 코드에 직접적인 트랜잭션 관리 로직을 작성하지 않고도, 어노테이션을 사용하여 메서드 레벨에서 트랜잭션을 관리할 수 있습니다.
  • 롤백 규칙: 기본적으로 @Transactional 어노테이션이 적용된 메서드에서 RuntimeException이 발생하면, 자동으로 롤백이 수행됩니다. 이는 @Transactional의 rollbackFor 속성을 통해 커스터마이징 할 수 있습니다.
  • 전파 행위(Propagation): @Transactional 어노테이션은 트랜잭션의 전파 행위를 지정할 수 있습니다. 예를 들어, 이미 진행 중인 트랜잭션이 있는 경우 해당 트랜잭션에 합류할 것인지, 새로운 트랜잭션을 시작할 것인지 등을 설정할 수 있습니다.
  • 격리 수준(Isolation Level): 데이터베이스의 동시성 문제를 처리하기 위한 격리 수준을 지정할 수 있습니다. 격리 수준에 따라 동시에 실행되는 트랜잭션들 사이의 보이는 데이터가 달라집니다.
  • 읽기 전용(Read-Only): 트랜잭션을 읽기 전용으로 표시할 수 있습니다. 이는 성능 최적화에 도움을 줄 수 있으며, 데이터 변경 시도를 방지하는 데 유용합니다.

 

사용 예시

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class MyService {

    @Transactional
    public void someTransactionalMethod() {
        // 이 메서드 내의 모든 데이터베이스 연산은 하나의 트랜잭션으로 관리됩니다.
    }
}

 

주의 사항

  • @Transactional 어노테이션이 적용된 메서드는 Public 메서드여야 합니다. Private나 Protected 메서드에 적용된 @Transactional은 무시됩니다.
  • 프록시 기반의 AOP가 사용되므로, 같은 클래스 내의 다른 메서드를 호출할 때는 @Transactional이 적용되지 않을 수 있습니다. 이 문제를 해결하기 위해 자기 참조(self-injection)를 사용하거나, 분리된 서비스 레이어를 사용할 수 있습니다.
  • @Transactional은 런타임 예외에 대해 자동으로 롤백을 수행합니다. 명시적으로 체크 예외에 대해 롤백하려면 rollbackFor 속성을 사용해야 합니다.

주요 발생 오류

  • 트랜잭션의 범위가 명확하지 않음
    • 원인: 트랜잭션의 시작과 끝이 명확하지 않거나, 예상치 못한 곳에서 트랜잭션이 시작되어서 의도치 않은 데이터베이스 작업이 트랜잭션에 포함될 수 있습니다.
    • 해결 방안: 트랜잭션을 적용할 메서드의 범위를 명확하게 하고, 필요한 경우 트랜잭션의 전파 속성을 적절히 설정하여 해결할 수 있습니다.
  • 트랜잭션이 롤백되지 않음
    • 원인: @Transactional은 기본적으로 런타임 예외가 발생했을 때만 롤백을 수행합니다. 체크 예외가 발생했을 때 트랜잭션이 롤백되지 않는 경우가 종종 발생합니다.
    • 해결 방안: rollbackFor 속성을 사용하여 롤백을 수행하고자 하는 예외를 명시적으로 지정할 수 있습니다.
  • 프록시 기반 AOP의 한계
    • 원인: Spring의 @Transactional은 프록시 기반의 AOP를 사용합니다. 따라서, 같은 클래스 내부에서 @Transactional이 적용된 메서드를 다른 메서드에서 직접 호출할 경우 트랜잭션이 적용되지 않을 수 있습니다.
    • 해결 방안: 자기 참조(self-injection)를 사용하거나, 트랜잭션을 적용할 메서드를 외부 클래스로 분리하여 호출하는 방법이 있습니다.
  • 트랜잭션 격리 수준 문제
    • 원인: 부적절한 트랜잭션 격리 수준 설정으로 인해 발생하는 동시성 문제(ex: 더티 리드, 팬텀 리드 등)가 있을 수 있습니다.
    • 해결 방안: 트랜잭션 격리 수준을 적절히 설정하여 이러한 문제를 해결할 수 있습니다. 격리 수준은 @Transactional의 isolation 속성을 통해 설정할 수 있습니다.
  • 의도치 않은 롤백 발생
    • 원인: 예외 처리 로직이 적절하지 않아 예외가 상위로 전파되면서 의도치 않은 롤백이 발생할 수 있습니다.
    • 해결 방안: 예외 처리를 적절히 하여 필요한 경우에만 예외가 상위로 전파되도록 관리해야 합니다.
  • 트랜잭션의 무시
    • 원인: @Transactional 어노테이션이 적용된 메서드가 Private이거나, 인터페이스가 아닌 클래스에 직접 적용되어 프록시 객체를 통한 AOP가 작동하지 않는 경우입니다.
    • 해결 방안: @Transactional 어노테이션은 Public 메서드에 적용해야 하며, 가능한 인터페이스 기반의 프로그래밍을 하는 것이 좋습니다.

 

오늘은 DB 트랜잭션에 대해 알아보았습니다.

데이터베이스 관련해서 Citus, MongoDB, Elasticsearch도 함께 보시면 좋습니다!

2024.03.26 - [IT] - [PostgreSQL] Citus란? (개념, 장단점, 면접 대비)

 

[PostgreSQL] Citus란? (개념, 장단점, 면접 대비)

CitusCitus는 PostgreSQL을 기반으로 한 분산 데이터베이스 확장입니다. 이는 PostgreSQL의 기능을 확장하여 대량의 데이터를 처리할 수 있게 해 주며, 높은 확장성과 병렬 처리 기능을 통해 빅 데이터 분

yuna-ninano.tistory.com

2024.04.02 - [IT] - [NoSQL] MongoDB란? (개념, 특징, 장단점, 면접대비)

 

[NoSQL] MongoDB란? (개념, 특징, 장단점, 면접대비)

NoSQLNoSQL(Not Only SQL)은 관계형 데이터베이스 시스템(RDBMS)의 전통적인 테이블 기반 구조 대신, 다양한 데이터 저장 기술을 사용하는 데이터베이스 관리 시스템의 총칭입니다. 기존의 SQL(Structured Que

yuna-ninano.tistory.com

2024.03.25 - [IT] - [엘라스틱서치] ElasticSearch란? (개념, 장단점, 면접 질문)

 

[엘라스틱서치] ElasticSearch란? (개념, 장단점, 면접 질문)

ElasticSearchElasticsearch는 Apache Lucene 기반의 오픈소스, 분산, RESTful 검색 엔진입니다. 대량의 데이터를 신속하고 거의 실시간에 가까운 속도로 저장, 검색, 분석할 수 있도록 설계되었습니다. Elasticse

yuna-ninano.tistory.com

반응형