[Spring] 트랜잭션

이병수·2024년 1월 23일
0

스프링 정리

목록 보기
12/24
post-custom-banner

Transaction(트랜잭션)이란?

DB 데이터들의 무결성과 정합성을 유지하기 위한 하나의 논리적인 개념이다.

Transaction은 하나의 흐름으로 하나의 실행이 성공하거나 실패하면 모든 연산들을 동일하게 처리하는 특징을 가지고 있다.

따라서, 모든 작업이 성공한다면 완료 작업 상태를 모두 반영하고, 이것을 Commit이라고 한다.
반면, 하나라도 실패할 경우 모든 사항을 중단하고, 이것을 Roll back 이라고 한다.

Transaction의 4가지 성질

Atomicity (원자성)

한 트랜잭션 내의 실행 작업은 하나의 단위로 처리한다.

이 말은 즉슨, 모두 성공을 하거나, 모두 실패한다는 의미이다.


Consistentcy (일관성)

트랜잭션은 일관성 잇는 데이터베이스 상태를 유지한다.

즉, 제약 조건이나 데이터 규칙에 위반하지 않은 일관성을 의미하게 된다.
하나의 동작이 정상적인 흐름을 일관적으로 가질 수 있어야 한다는 것이다.


Isolation (독립성)

동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 독립한다.

하나의 동작 중 다른 트랜잭션의 개입으로 데이터가 변경되어서는 아니된다.
따라서 한 동작이 독립적으로 처리해야한다는 원칙이다.


Durability (영속성)

트랜잭션을 성공적으로 마치면 결과가 항상 저장된다.

트랜잭션의 동작이 성공 후 commit이 된다면 영원히 반영되어야 한다는 원칙이다.



Spring의 트랜잭션

  • Spring 프레임워크에서는 DB의 트랜잭션 개념을 애플리케이션에 적용할 수 있도록 트랜잭션 관리자를 제공한다.
@Transactional
public class Test {
	~~
    @Transactional
    public int testMethod() {
    	~~
     }
}

위의 예시코드처럼 @Transactional 어노테이션을 클래스나 메서드에 추가하면 쉽게 트랜잭션 개념을 적용할 수 있게 된다.

  • 메서드가 호출되면, 해당 메서드 내에서 수행되는 모든 DB 연산 내용은 하나의 트랜잭션으로 묶는다.

  • 해당 메서드가 정상적으로 수행되면 commit을 하고, 예외가 발생하면 rollback을 하게 된다.

  • 클래스에 선언한 @Transactional 은 해당 클래스 내부의 모든 메서드에 트랜잭션 기능을 부여한다.



트랜잭션 전파

트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법을 결정하는 속성이다.

즉, 여러 트랜잭션 적용 범위를 묶어서 커다란 트랜잭션 경계를 만들 수 있다.

REQUIRED

@Transactional(propagation = Propagation.REQUIRED)
  • Default 값, 이미 시작된 트랜잭션이 있으면 참여하고, 없으면 새로 생성해서 시작한다.

  • 하나의 트랜잭션이 시작된 후 다른 트랜잭션 경계가 설정된 메소드를 호출하면 자연스레 같은 트랜잭션으로 묶는다.


SUPPORT

@Transactional(propagation = Propagation.SUPPORT)
  • 이미 시작된 트랜잭션이 있으면 참여하고, 없으면 트랜잭션 없이 진행한다.

MANDATORY

@Transactional(propagation = Propagation.MANDATORY)
  • 이미 시작된 트랜잭션이 있으면 참여하고, 없으면 예외를 발생한다.

REQUIRES_NEW

@Transactional(propagation = Propagation.REQUIRES_NEW)
  • 항상 새로운 트랜잭션을 시작하고, 이미 시작된 트랜잭션이 있으면 보류하고 생성하낟.

NOT_SUPPORTED

@Transactional(propagation = Propagation.NOT_SUPPORTED)
  • 트랜잭션을 전혀 사용하지 않고, 이미 시작된 트랜잭션이 있으면 보류한다.

NEVER

@Transactional(propagation = Propagation.NEVER)
  • 트랜잭션을 강제로 사용하지 않고, 이미 시작된 트랜잭션이 있으면 예외를 발생한다.

NESTED

@Transactional(propagation = Propagation.NESTED)
  • 이미 시작된 트랜잭션이 있으면 중첩 트랜잭션을 시작하고, 부모 트랜잭션에 영향을 주지 않는다.

  • 즉, 트랜잭션 안의 트랜잭션이라고 생각하면 된다.

  • 먼저 시작한 부모 트랜잭션의 커밋과 롤백에는 영향을 받지만 자신의 트랜잭션의 커밋과 롤백은 부모 트랜잭션에게 영향을 주지 않는다.

profile
백엔드 개발자가 되고 싶어요
post-custom-banner

0개의 댓글