Back-end

[Spring] Transaction(트랜잭션)에 대해

diddl 2021. 11. 26. 13:43
반응형

Transaction(트랜잭션)이란?

데이터베이스의 상태를 변화시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다.

여러 작업을 진행하다 문제가 생겼을 경우 이전 상태로 롤백하기 위해 사용되는 것이다. 따라서 트랜잭션은 더 이상 쪼갤 수 없는 최소 작업 단위를 의미하며 commit을 성공하거나 rollback으로 실패 이후 취소되어야 한다.

Rollback : 오류가 발생했을 때, 오류 이전의 특정 시점 상태로 되돌려 줌
Commit : 트랜잭션에 대한 작업이 성공적으로 끝났고 데이터베이스가 일관된 상태에 있을 때 , 연산이 완료된 것을 트랜잭션 관리자에게 알려주는 연산
CheckPoint : 롤백을 위한 시점을 저장

 

트랜잭션의 특성

ACID

Atomicity(원자성)

  • 분해가 불가능한 작업의 최소 단위
  • 즉 트랜잭션의 연산은 데이터베이스에 모두 반영되든가 아니면 전혀 반영되지 않아야 한다. 분리할 수 없다.
  • 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하고, 어느하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 한다.

 

Consistency(일관성)

  • 트랜잭션 실행 성공 후 항상 일관된 데이터베이스 상태를 보존해야 한다.
  • 시스템이 가지고 있는 고정 요소는 트랜잭션 수정 전후의 상태가 같아야 한다.

 

Isolation(독립성, 격리성)

  • 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행 중 생성하는 연산의 중간 결과는 다른 트랜잭션이 접근 불가 하다.
  • 즉 수행 중인 트랜잭션이 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.

 

Durablility(영속성, 지속성)

  • 성공이 완료된 트랜잭션의 결과는 영속적으로 데이터베이스에 저장한다.

 

트랜잭션의 상태

  • Active(활동) : 트랜잭션 실행 중인 상태
  • Failed(실패) : 트랜잭션 실행에 오류가 발생하여 중단된 상태
  • Aborted(철회) : 트랜잭션이 비정상적으로 종료되어 Rollback연산을 수행한 상태
  • Partially Committed(부분 완료) : 트랜잭션의 마지막 연산까지 실행 후 Commit연산이 실행되기 직전의 상태
  • Committed(완료) : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태

 

 

Spring에서의 Transaction 사용

Spring @Transactional 어노테이션

Spring에서는 선언적 트랜잭션을 제공하고 있다. 주로 @Transactional 어노테이션을 사용사여 정의한다.

일반적으로 Spring에서는 Service Layer에서 @Transactional을 추가하여 Transactoin 처리를 한다. 아래 예시는 댓글 수정기능을 호출 했을 때 일어나는 부분이고 DB를 업데이트 해야함으로 Transaction을 설정해두었다.

@RequiredArgsConstructor
@Service
public class CommentService {
    private final CommentRepository commentRepository;

    @Transactional
    public void updateComment(Long id, CommentRequestDto requestDto){
        Comment comment = commentRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("해당 댓글이 존재하지 않습니다.")
        );
        comment.update(requestDto);
    }
}

 

 

 

 

 

Reference : https://mangkyu.tistory.com/50?category=761302, https://coding-factory.tistory.com/226

반응형