본문 바로가기
IT 지식/데이터베이스

[DB & BOOT] 트랜잭션

by 이민우 2021. 5. 30.
728x90
반응형

트랜잭션이란?

 

데이터베이스의 작업 수행 단위이다.

조금 더 상세하게 말하면, 데이터베이스의 상태를 변경시킬 수 있는 모든 연산들을 의미한다.

 

트랜잭션은 4개의 성질을 가지고 있다.

  1. 독립성 (Isolation) : 동시에 실행되어도 서로 영향을 미치지 말아야 한다.
  2. 일관성 (Consistency) : 늘 일관성 있는 상태를 유지해야 한다.
  3. 영속성 (Durability) : 트랜잭션이 성공적으로 수행되면 그 상태가 영구적으로 반영되어야 한다.
  4. 원자성 (Atomicity) : 한 트랜잭션 내의 작업은 하나의 단위로 처리한다. 즉, 일부만 반영되지 않는다.

*독일영원으로 암기

 

트랜잭션은 위의 4가지 성질을 지키며, DB의 상태를 잘 유지해주어야 한다.

그렇다면 Spring Boot에서는 이 트랜잭션을 어떻게 사용할까?

쉽다. 이미 전부 Bean으로 만들어져 있으니까.

 

 

@Transactional

 

스프링 부트에서는 별도의 설정 필요 없이, org.springframework.transaction.annotation.Transactional 에 들어있다.

@Transactional은 그냥 사용해도 되고, 상황에 따라 다양한 파라미터를 적용할 수도 있다.

 

propagation 트랜잭션 동작 중 다른 트랜잭션 호출 시에 대한 대처
isolation 일관성 없는 데이터 허용 수준
rollbackFor=Exception.class 특정 예외 발생시 rollback
noRollbackFor=Exception.class 특정 예외 발생시 rollback 하지 않음
timeout 지정한 시간 내에 수행되지 않으면 롤백 (-1 입력시 무제한)
readOnly 읽기전용 (그 외 연산 수행시 예외)

*이 중 propagation과 isolation에는 다양한 옵션 적용이 가능하다.

 

 

Propagation

REQUIRED 디폴트값. 진행중인 트랜잭션 존재시 따르고, 아니라면 새로 생성
REQUIRED_NEW 항상 새로운 트랜잭션 생성
SUPPORT 진행중인 트랜잭션 존재시 따르고, 없다면 설정하지 않는다.
NOT_SUPPORT 진행중인 트랜잭션 존재시 보류, 트랜잭션 없이 수행
MANDATORY 이미 진행중인 트랜잭션이 있어야만 작업 수행. 없으면 Exception
NEVER 트랜잭션이 진행 중이지 않으면 작업 수행. 있다면 Exception
NETSTED 트랜잭션 진행 중이면 중첩해서 실행, 없으면 새로 생성

 

 

Isolation

DEFAULT 사용하는 DB의 디폴트 설정 사용. (대부분은 READ_COMMITED)
READ_COMMITED 검색에 공유 로크를 걸지 않아 오손 데이터를 읽을 수 있다.
READ_UNCOMMITED 검색에 공유 로크를 걸고 읽자마자 해제하여 이전과 다른 데이터를 읽을 수 있다.
REPEATABLE_READ 검색에 공유 로크를 걸고 트랜잭션이 끝날 때까지 보유한다.
SERIALIZABLE 튜플 뿐 아니라 인덱스에 대해서도 공유 로크를 걸고 끝날 때까지 보유한다.

*자세한 내용은 별도의 포스팅 참조 : https://123okk2.tistory.com/248

 

728x90
반응형