스파이더 웹 개발

@Transactional 알고 쓰자 본문

Spring

@Transactional 알고 쓰자

스파이더웹 2022. 7. 24. 00:36
728x90
반응형

@Transactional에 대해 알고 사용했을까..? rollback이 된다는 것 말고는 깊게 알지못하였다. 이번에 코드리뷰 멘토링을 통해 해당 내용에대해 알고써야하는것을 알게되었기에 이렇게 정리하게되었다.

트랜잭션이란?

데이터베이스 상태를 변경하는 작업 또는 한번에 수행되어야 하는 연산들을 의미
하나의 트랜잭션은 Commit 되거나 Rollback 된다

- Commit 연산

  • 한개의 논리적 단위(트랜잭션)에 대한 작업이 성공적으로 끝나 데이터베이스가 다시 일관된 상태가 되었을 때, 이 트랜잭션이 행한 갱신 연산이 완료된 것을 트랜잭션 관리자에게 알려주는 연산이다

- Rollback 연산

  • 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 이 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소하는 연산이다
  • Rollback시에는 해당 트랜잭션을 재시작하거나 폐기한다

트랜잭션의 성질(ACID)

원자성

  • 트랜잭션의 모든 연산들은 정상적으로 수행 완료되거나 아니면 전혀 어떠한 연산도 수행되지 않은 상태를 보장해야 한다.

일관성

  • 트랜잭션 완료 후에도 데이터베이스가 일관된 상태로 유지되어야 한다.

독립성

  • 하나의 트랜잭션이 실행하는 도중에 변경한 데이터는 이 트랜잭션이 완료될 때까지 다른 트랜잭션이 참조하지 못한다.

지속성

  • 성공적으로 수행된 트랜잭션은 영원히 반영되어야 한다.

@Transactional 옵션

1. isolation

@Transactionalisolation 은 트랜잭션에서 일관성이 없는 데이터를 허용하도록 하는 수준
Spring 의 @Transactional 에서는 총 5가지 isolation 옵션을 제공합니다.

1-1 DEFAULT

  • 기본이며, DB의 lsolation Level을 따른다.


1-2 READ_UNCOMMITTED (level 0) : 커밋되지 않는 데이터에 대한 읽기를 허용

  • 어떤 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 B라는 아직 완료되지 않은(Uncommitted 혹은 Dirty)데이터 B를 읽을 수 있다.
  • Dirty Read 발생


1-3 READ_COMMITED (level 1) : 커밋된 데이터에 대해 읽기 허용

  • 어떠한 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 해당 데이터에 접근할 수 없다.
  • Dirty Read 방지


1.4 REPEATEABLE_READ (level 2) : 동일 필드에 대해 다중 접근 시 모두 동일한 결과를 보장

  • 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정이 불가능하다.
  • 선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 후행 트랜잭션이 갱신하거나 삭제가 불가능 하기 때문에 같은 데이터를 두 번 쿼리했을 때 일관성 있는 결과를 리턴한다.
  • Non-Repeatable Read 방지


1.5 SERIALIZABLE (level 3) : 가장 높은 격리, 성능 저하의 우려가 있음

  • 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 Level
  • 완벽한 읽기 일관성 모드를 제공한다.
  • 따라서, 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능하다.
  • Phantom Read 방지
격리수준에 따른 문제 정리

Dirty Read

  • 트랜잭션 1이 수정중인 데이터를 트랜잭션 2가 읽을 수 있다. 만약 드랜잭션 1의 작업이 정상 커밋되지 않아 롤백되면, 트랜잭션 2가 읽었던 데이터는 잘못된 데이터가 되는 것이다.

Non-repeatable read

  • 트랜잭션 1이 회원 A를 조회중에 트랜잭션 2가 회원 A의 정보를 수정하고 커밋한다면, 트랜잭션 1이 다시 회원A를 조회했을 때는 수정된 데이터가 조회된다. (이전 정보를 다시 조회할 수 없음). 이처럼 반복해서 같은 데이터를 읽을 수 없는 경우이다.

Phantom read

  • 트랜잭션 1이 10살 이하의 회원을 조회했는데 트랜잭션 2가 5살 회원을 추가하고 커밋하면 트랜잭션 1이 다시 10살 이하 회원을 조회했을 때 회원 한명이 추가된 상태로 조회된다. 이처럼 반복 조회시 결과집합이 달라지는 경우이다.

2. propagation (전파속성)


2.1 REQUIRED (Defualt)

  • 이미 진행중인 트랜잭션이 있다면 해당 트랜잭션 속성을 따르고, 진행중이 아니라면 새로운 트랜잭션을 생성한다.

2.2 REQUIRES_NEW

  • 항생 새로운 트랜잭션을 생성한다. 이미 진행중인 트랜잭션이 있다면 잠깐 보류하고 해당 트랜잭션 작업을 먼저 진행한다

2.3 SUPPORT

  • 이미 진행 중인 트랜잭션이 있다면 해당 트랜잭션 속성을 따르고, 없다면 트랜잭션을 설정하지 않는다.

2.4 NOT_SUPPORT

  • 이미 진행중인 트랜잭션이 있다면 보류하고, 트랜잭션 없이 작업을 수행한다.

2.5 MANDATORY

  • 이미 진행중인 트랜잭션이 있어야만, 작업을 수행한다. 없다면 Exception을 발생시킨다.

2.6 NEVER

  • 트랜잭션이 진행중이지 않을 때 작업을 수행한다. 트랜잭션이 있다면 Exception을 발생시킨다.

2.7 NESTED

  • 진행중인 트랜잭션이 있다면 중첩된 트랜잭션이 실행되며, 존재하지 않으면 REQUIRED와 동일하게 실행된다.

3. noRollbackFor (예외무시)

특정예외 발생 시 Rollback 처리 하지 않음

4. rollbackFor (예외추가)

특정 예외 발생 시 강제로 Rollback

5.readOnly (읽기전용)

trueinsert, update, delete 실행 시 예외 발생
Default = flase

6. timeout (시간지정)

지정한 시간 내에 해당 메소드 수행이 완료되지 않을 경우 rollback 수행
-1일 경우 no timeout
Default = -1


참고
https://bcp0109.tistory.com/322 <
https://velog.io/@kdhyo/JavaTransactional-Annotation-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-26her30h
https://taetaetae.github.io/2016/10/08/20161008/

728x90
반응형

'Spring' 카테고리의 다른 글

컴포넌트 스캔  (0) 2022.07.30
싱글톤 컨테이너  (0) 2022.07.29
스프링 컨테이너와 스프링 빈  (0) 2022.07.25
스프링 빈 조회  (0) 2022.07.20
스프링 기본  (0) 2022.07.20
Comments