[DB] 트랜잭션이란

smlee·2022년 6월 20일
0

Back-end

목록 보기
15/26

스프링부트에서 @Transactional 어노테이션은 말 그대로 트랜잭션을 처리하는 어노테이션이다. 그렇다면 트랜잭션이란 무엇일까?

트랜잭션(Transaction)

Transaction(트랜잭션)이란, 데이터베이스의 상태를 변화시키기 위해서 수행하는 논리적인 작업 단위를 의미한다.

그렇다면 작업단위란 무엇일까?
보통은 SELECT, UPDATE, INSERT, DELETE 등과 같은 DML 명령어들을 이용하여 데이터베이스에 접근하는 것을 말한다.

이때, 작업 단위는 여러 개의 쿼리문이 될 수도 있다.

트랜잭션의 특징

트랜잭션의 특징에는 ACID가 있다.
1. 원자성(Atomicity)

  • 트랜잭션이 데이터베이스에 모두 반영되던가 전혀 반영되지 않아야한다.
  • All or Nothing
  1. 일관성(Consistency)
  • 트랜잭션이 진행되는 동안에 데이터베이스가 변경되더라도 업데이트된 DB로 진행되는 것이 아닌, 처음에 트랜잭션을 진행하기 위해 참조한 데이터들로 진행된다.
  1. 독립성(Isolation)
  • 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떠한 하나의 트랜잭션은 다른 트랜잭션에 끼어들 수 없다
  1. 지속성(Durability)
  • 트랜잭션이 완료되었을 경우, 결과는 영구적으로 반영한다.

Commit / Rollback

(1) Commit

하나의 트랜잭션이 성공적으로 수행되었으며, 데이터베이스가 일관성 있는 상태일 때 하나의 트랜잭션이 끝났다라고 하며, 이를 Commit되었다라고 한다.

(2) Rollback

하나의 트랜잭션이 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 경우 트랜잭션을 처음부터 다시 시작하거나 부분적으로 연산된 결과를 다시 취소 시킨다.

@Transactional

스프링에서는 @Transactional 어노테이션을 통해 메서드, 클래스, 인터페이스의 트랜잭션 처리가 가능하다. 이러한 방식을 선언적 트랜잭션이라고 한다. 이를 사용하면 트랜잭션 기능이 들어가 있는 프록시 객체가 생성되어 자동으로 커밋이나 롤백을 해준다.

@Transactional
public void createVideoLike(PostVideoLikeReq postVideoLikeReq)  throws BaseException{
       try{
           if(likeProvider.checkExistingUser(postVideoLikeReq.getUserId()) == 0){
               throw new BaseException(BaseResponseStatus.USER_NOT_EXISTS);
           }

           if(likeProvider.checkVideoLike(postVideoLikeReq) == 1){
               throw new BaseException(BaseResponseStatus.POST_LIKES_ALREAY_EXISTS);
           }
            int result = likeDao.createVideoLike(postVideoLikeReq);
            if(result == 0){
                throw new BaseException(BaseResponseStatus.POST_RESULT_NOT_EXISTS);
            }
        }
        catch (Exception exception){
            throw new BaseException(BaseResponseStatus.DATABASE_ERROR);
        }
    }

위의 코드는 영상에 좋아요를 추가하는 메소드이다. 이 코드 위에 @Transactional 어노테이션이 붙어있다. 좋아요를 추가하는 과정이므로 INSERT 과정이다. 따라서 트랜잭션 기능을 수행하도록 @Transactional 어노테이션을 추가해주었다.

이러한 트랜잭셔널 어노테이션에는 여러가지 옵션들이 있으며, 필요에 따라 이 어노테이션에 옵션을 주어 사용하면 된다.

0개의 댓글