Spring

Spring_Chapter08_Transaction

강용민 2022. 5. 12. 14:47

트랜잭션

만약 데이터베이스의 데이터를 수정하는 도중에 예외가 발생된다면 어떻게 해야 할까?

DB의 데이터들은 수정이 되기 전의 상태로 다시 되돌아가져야 하고, 다시 수정 작업이 진행되어야 할 것이다.

이렇듯 여러 작업을 진행하다가 문제가 생겼을 경우 이전 상태로 롤백하기 위해 사용되는 것이 트랜잭션(Transaction)이다.

 

트랜잭션은 더 이상 쪼갤 수 없는 최소 작업단위이며 전체 로직이 모두 다 반영되거나 모두 반영되지 않은 논리적인 작업(All or Nothing)의 묶음을 의미한다.

논리적 단위로 어떤 한 부분의 작업이 완료되었다 하더라도, 다른 부분의 작업이 완료되지 않을 경우 전체 취소한다.

이때 작업이 완료되는 것을 커밋(commit)이라 하며, 작업이 취소되는 것을 롤백(rollback)이라 한다.

 

트랜잭션의 기본 원칙(ACID)

트랜잭션은 아래와 같은 특징을 갖고 있다.

  • 원자성(Atomicity)
    • 한 트랜잭션 내의 모든 연산들이 완전히 수행되거나 전혀 수행되지 않는다.
  • 일관성(Consistency)
    • 어떤 트랜잭션이 수행되기 전에 데이터베이스가 일관된 상태를 가졌다면 트랜잭션이 수행된 후에 데이터베이스 또는 다른 일관된 상태를 가진다.
  • 고립성(Isolation)
    • 한 트랜잭션이 데이터를 갱신하는 동안 이 트랜잭션이 완료되기 전에는 갱신 중인 데이터를 다른 트랜잭션에서 접근할 수 없다.
  • 지속성(Durability)
    • 일단 한 트랜잭션이 완료되면 데이터베이스에 반영한 수행 결과는 영구적이여야 한다.

 

트랜잭션의 경계

트랜잭션의 경계는 presentation Layer와 Business Layer 사이에 놓여지는 것이 전통적인 방식이다.

AOP로 서비스에 트랜잭션 처리를 구현한 어드바이스를 적용함으로써 서비스 내부를 수정하지 않고 트랜잭션을 처리한다.

이때, 트랜잭션 처리는 트랜잭션 관리자와 트랜잭션 어드바이스를 이용한다.

 

트랜잭션 관리자

Spring은 데이터베이스 연동 기술과 트랜잭션 서비스 사이의 종속성을 제거하고 트랜잭션 추상 계층을 이용해서 데이터베이스 연동 기술에 상관없이 동일한 방식으로 트랜잭션 관리 기능을 제공한다.

Spring이 제공하는 트랜잭션 경계 설정을 위한 추상 인터페이스는 PlatformTransactionManager이다.

스프링을 이용해서 트랜잭션을 처리하기 위해서 DB 연동 기술에 적합한 트랜잭션 관리자를 등록한다.

 

대표적인 트랜잭션 구현 클래스

Spring의 DefaultTransactionDefinition이 구현하고 있는 TransactionDefinition 인터페이스는 트랜잭션의 동작방식에 영향을 줄 수 있는 4가지 속성을 정의한다.

아래 4가지 속성은 트랜잭션 시작과 종료, 롤백 처리를 비롯해 트랜잭션의 정의 정보를 설정하며, @Transactional 어노테이션에도 공통적으로 적용할 수 있다.

  • 전파(Propagation) 속성, 독립성(Isolation) 수준
    • 전파속성
      기존 트랜잭션이 있는 상태에서 새로운 트랜잭션을 별도로 생성하거나 기존 트랜잭션에 포함시켜 실행하도록 설정하기 위한 트랜잭션 전파에 대해 설정한다.
    • 독립성수준
      트랜잭션 처리가 병행해서 실행될 때 각 트랜잭션의 독립성을 결정한다.
      하나의 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 정도를 나타낸다.
  • 롤백(rollback)의 대상 예외, 커밋(commit)의 대상 예외
  • 읽기 (read-only) 전용, 타임아웃(timeout)
    • 읽기 전용
      트랜잭션 내의 처리가 읽기 전용으로 설정
    • 만료 시간
      트랜잭션이 취소되는 만료 시간을 초 단위로 설정

@Tansactional

전파 속성

2개 이상의 트랜잭션이 작동할 때, 기존 ㅌ랜잭션에 참여하는 방법을 결정하는 속성으로, 디폴트값은 REQUIRED로 되어있다.

전파속성 설명
MANDATORY 기존의 트랜잭션이 존재하면 포함되어 실행하고, 기존 트랜잭션이 존재하지 않으면 예외 발생
NESTED 기존 트랜잭션이 존재하면 포함되어 실행, 없으면 새로운 트랜잭션 생성
REQUIRED와 동일하지만 SAVEPOINT를 지정한 시점까지 부분 롤백이 가능하다는 차이점이 있다.
NEVER 기존 트랜잭션이 존재하면 예외 발생하고, 없으면 트랜잭션 없이 실행
SUPPORTS 기존 트랜잭션이 존재하면 포함해서 실행하고, 없으면 트랜잭션 없이 실행
NOT_SUPPORTED 기존 트랜잭션이 존재하나 안하나 트랜잭션 없이 실행
REQUIRED 기존 트랜잭션이 있으면 해당 트랜잭션에 포함되고, 없으면 새로운 트랜잭션 생성
REQUIRED_NEW 항상 새로운 트랜잭션 실행, 기존 트랜잭션 존재하면 일시 중지하고 새로운 트랜잭션이 완료 후에 기존 트랜잭션 실행
   

 

[참조]

https://mangkyu.tistory.com/154 [MangKyu's Diary]

'Spring' 카테고리의 다른 글

토비의 Spring_Chapter01_오브젝트와 의존관계  (0) 2022.10.11
SpringBoot_Chapter01_개요  (0) 2022.10.05
Spring_Chapter07_A.O.P  (0) 2022.05.02
Spring_Chapter06_스프링+MyBatis  (0) 2022.04.29
Spring프레임워크_Chapter05_스프링 MVC  (0) 2022.04.08