트랜잭션 매니저

김회민·2023년 2월 25일
0

Spring Data

목록 보기
5/7

트랜잭션 매니저

package org.springframework.transaction;

public interface PlatformTransactionManager extends TransactionManager {

    TransactionStatus getTransaction(
            @Nullable TransactionDefinition definition
    ) throws TransactionException;

    void commit(TransactionStatus status) throws TransactionException;
    void rollback(TransactionStatus status) throws TransactionException;
}

Transaction Manager란, 트랜잭션의 시작, commit, rollback을 추상화한 인터페이스이다. 정말 불행하게도 각 구현체마다 데이터 소스에서 커넥션을 받아오고 트랜잭션을 시작하고 끝내는 것을 담당하는 메서드의 이름이 다른데, 이들의 이름을 통합하고 거기에 더해 데이터 소스를 관리하기 위해 만들어진 것이 바로 트랜잭션 매니저이다.

또한 트랜잭션 매니저는 ThreadLocal를 이용해 각 커넥션을 동기화해주는 트랜잭션 동기화 매니저를 지원한다. 커넥션 풀에서 할당 받은 데이터 소스를 동기화 매니저에 담아 하나의 쓰레드에서 실행되는 다른 메서드(리포지토리, 서비스 등)이 데이터 소스를 파라미터로 전달받지 않고도 사용할 수 있도록 기능을 지원한다.

또한 트랜잭션이 종료되면 트랜잭션 매니저는 동기화 매니저에 보관된 커넥션을 다시 가져와서 데이터 소스에게 반납하는 과정도 진행한다.

DataSourceUtils

DataSourceUtils는 ThreadLocal에 들어간 커넥션을 가져오고 반납하는 역할을 하는 편의 객체이다. 대표적인 메서드들은 아래 2가지가 있다.

  • getConnection()
    • 트랜잭션 동기화 매니저가 관리하는 커넥션을 획득하는 메서드이다.
    • 만약, 동기화 매니저가 관리하는 커넥션이 없는 경우, 새로운 커넥션을 생성해서 반환한다.
  • releaseConnection()
    • 획득한 커넥션을 반납하는 메서드이다.
    • 트랜잭션 동기화 매니저가 관리하는 커넥션인 경우 커넥션을 닫지않고 그대로 유지한다.
      • 트랜잭션이 종료되면, 그때 트랜잭션 매니저가 커넥션을 닫는다.
    • 그렇지 않다면, 아까 생성된 커넥션을 즉시 닫는다.

TransactionDefinition

공식 Docs
트랜잭션의 동작방식에 영향을 주는 네 가지 속성을 정의한다.

트랜잭션 전파 ( Transaction Propagation )

트랜잭션 전파란, 트랜잭션 A안에서 트랜잭션 B가 호출되는 경우 진행되는 과정을 말한다.

  • PROPAGATION_REQUIRED
    • 기본값
    • 부모 트랜잭션이 있다면 해당 트랜잭션에 합류한다.
      • 트랜잭션 B가 성공하더라도 트랜잭션 A가 실패하면 트랜잭션 B도 Rollback 한다.
    • 없다면 새로운 트랜잭션을 시작한다.
  • PROPAGATION_SUPPORTS
    • 부모 트랜잭션이 있다면 해당 트랜잭션에 합류한다.
    • 없다면 트랜잭션을 생성하지 않고 로직을 진행한다.
  • PROPAGATION_MANDATORY
    • 부모 트랜잭션이 있다면 해당 트랜잭션에 합류한다.
    • 없다면 예외를 던진다.
  • PROPAGATION_REQUIRES_NEW
    • 부모 트랜잭션과 별개의 트랜잭션을 생성한다.
    • 즉, 각각의 트랜잭션이 서로 독립적이다.
  • PROPAGATION_NOT_SUPPORTED
    • 부모 트랜잭션을 잠시 멈추고, 새로운 트랜잭션을 생성한다.
    • 없다면 트랜잭션을 생성하지 않고 로직을 진행한다.
  • PROPAGATION_NEVER
    • 부모 트랜잭션이 있다면 예외를 던진다.
    • 없다면 트랜잭션을 생성하지 않고 로직을 진행한다.
  • PROPAGATION_NESTED
    • 부모 트랜잭션이 있다면 중첩 트랜잭션을 생성한다.
      • 중첩 트랜잭션이 끝나도 부모 트랜잭션이 끝날 때 커밋된다.
      • 중첩 트랜잭션 내부에서 Rollback이 발생하면 부모 트랜잭션은 무시한다.
      • 중첩 트랜잭션이 무사히 끝나도 부모 트랜잭션에서 실패하면 같이 Rollback된다.
    • 없다면 새로운 트랜잭션을 시작한다.

격리 수준 ( Isolation Level )

  • ISOLATION_DEFAULT
    • 기본값, 해당 DBMS의 설정값을 따른다.
  • ISOLATION_READ_UNCOMMITTED
  • ISOLATION_READ_COMMITTED
  • ISOLATION_REPEATABLE_READ
  • ISOLATION_SERIALIZABLE

제한 시간 ( Timeout )

  • TIMEOUT_DEFAULT
    • 기본값: -1
    • DBMS의 설정값을 따른다.

읽기 전용 ( Read Only )

  • 기본값: false
profile
백엔드 개발자 지망생

0개의 댓글