Spring Transaction

5w31892p·2022년 12월 26일
0

Spring

목록 보기
15/30

Transaction

  • 데이터베이스에서 데이터에 대한 하나의 논리적 실행단계
  • 더 이상 쪼갤 수 없는 최소단위의 작업
  • 전부다 OK (Commit)거나 다 NO(Rollback)거나 확실한 놈

:: ACID 원칙

Atomicity 원자성

  • 한 트랜잭션 내의 실행 작업은 하나의 단위로 처리
  • 즉, 모두 성공 또는 모두 실패!
  • 하나라도 작은 오류 발생 시 모든 작업 취소 -> rollback

Consistency 일관성

  • 실행 성공적으로 완료 후 일관성 있는 데이터베이스 상태 유지
  • 시스템이 가지고 있는 고정적인 요소는 수행 전, 후 상태가 같아야 함
  • 제약조건이나 데이터 규칙 위반하지 않는 일관성
  • 하나의 동작이 정상적인 흐름을 일관적으로 가질 수 있어야 한다는 원칙

Isolation 독립성

  • 격리성이라고도 함
  • 동시 실행되는 트랜잭션들이 서로 영향 미치지 않도록 독립
  • 하나의 트랜잭션 실행될 때 다른 트랜잭션의 연산에 끼어들 수 없음
  • 수행중인 트랜잭션 결과 참조하려면 완전히 완료될 때 까지 기다려야 함
  • 즉, 한 동작이 독립적으로 처리해야한다는 원칙

Durability 영속성

  • 성공 ? -> 저장!
  • Commit 된다면 영원히 반영되어야 한다는 원칙 (고장나도 ~~ 영원히~~)

:: 트랜잭션의 상태

Active

  • 트랜잭션 활동 중
  • 즉 실행 중인 상태

Partially Committed

  • 트랜잭션이 연산이 끝나고, Commit 이 실행되기 직전의 상태

Committed

  • 트랜잭션이 성공적으로 종료되고 Commit연산을 수행한 후의 상태

Failed

  • 트랜잭션 실행시 오류 발생으로 인해 트랜잭션이 중단된 상태

Aborted

  • 트랜잭션 비정상 종료 후 Rollback 연산 수행한 상태


@Transactional

  • 선언적 트랜잭션
  • 트랜잭션 기능이 들어가 있는 프록시 객체가 생성되어 자동으로 commit or rollback
  • 해당 타깃을 포인트 컷의 대상으로 자동 등록하며 트랜잭션 관리 대상된다.
  • 포인트 컷에 등록하고 트랜잭션 속성을 부여하는 것
  • 테스트에 붙이면 테스트의 DB 커밋을 롤백해주는 기능이 있다.

:: @Transactional 옵션

:: 트랜잭션의 격리 수준 (Isolation Level)

DEFAULT
데이터 베이스에서 설정된 기본 격리 수준
READ_UNCOMMITED
트랜잭션이 아직 커밋되지 않은 데이터를 읽을 수 있다.
READ_COMMITED
Dirty Read 를 방지하기 위해 Commit 된 데이터만 읽을 수 있다.
REPEATABLE READ
트랜잭션이 완료될 때까지 조회한 모든 데이터에 shared lock이 걸리므로 트랜잭션이 종료될 때까지 다른 트랜잭션은 그 영역에 해당하는 데이터를 수정할 수 없다.
즉, 다 될때까지 기다려라!
SERIALIZABLE
가장 엄격한 트랜잭션 격리수준, 완벽한 읽기 일관성 모드를 제공한다.
이 격리 수준에서는 동시성 처리 성능이 급격히 떨어질 수 있다.

:: 트랜잭션 전파 옵션 (Propagation)

REQUIRED
이미 시작된 트랜잭션이 있으면 참여하고, 없으면 새로운 트랜잭션을 시작 (디폴트 속성)
SUPPORTS
이미 시작된 트랜잭션이 있으면 참여하고, 없으면 트랜잭션 없이 처리
REQUIRED_NEW
항상 새로운 트랜잭션을 시작, 이미 진행중인 트랜잭션이 있다면 잠시 보류
MANDATORY
이미 시작된 트랜잭션이 있으면 참여하고, 없으면 새로운 트랜색션을 시작하는 대신 예외를 발생시킨다.
혼자서는 독립적으로 수행되면 안되는 경우에 사용
NOT_SUPPORTED
트랜잭션을 사용하지 않고 처리
이미 진행중인 트랜잭션이 있다면 잠시 보류
NEVER
트랜잭션을 사용하지 않도록 강제시킨다.
이미 진행중인 트랜잭션 또한 허용하지 않으며, 있다면 예외를 발생시킨다.
NESTED
이미 실행중인 트랜잭션이 있다면 중첩하여 트랜잭션을 진행한다.
부모 트랜잭션은 중첩 트랜잭션에 영향을 주지만 중첩 트랜잭션은 부모 트랜잭션에 영향을 주지 않는다.

:: readOnly 옵션

readOnly
읽기전용
JPA의 경우, 해당 옵션을 true 로 설정하게 되면 트랜잭션이 커밋되어도 영속성 컨텍스트를 플러시하지 않는다.
플러시할 때 수행되는 엔티티의 스냅샷 비교 로직이 수행되지 않으므로 성능을 향상 시킬 수 있다.


0개의 댓글