TIL

[24.08.19] SpringMybatis 내용 몇가지 간단 정리

DongHo 2024. 8. 19. 08:48

트랜잭션 전파 옵션

  • REQUIRED: 현재 트랜잭션이 있으면 그 트랜잭션에서 실행하고, 없으면 새 트랜잭션을 시작합니다.
  • REQUIRED_NEW: 항상 새 트랜잭션을 시작하며, 기존 트랜잭션이 있으면 잠시 중단합니다.
  • SUPPORTS: 트랜잭션이 있으면 그 트랜잭션 내에서 실행하고, 없으면 트랜잭션 없이 실행합니다.
  • NOT_SUPPORTED: 트랜잭션 없이 실행하며, 기존 트랜잭션이 있으면 잠시 중단합니다.
  • MANDATORY: 반드시 트랜잭션 내에서 실행하며, 진행 중인 트랜잭션이 없으면 예외를 발생시킵니다.
  • NEVER: 트랜잭션 없이 실행하며, 기존 트랜잭션이 있으면 예외를 발생시킵니다.
  • NESTED: 현재 트랜잭션이 있으면 중첩 트랜잭션 내에서 실행하며, 없으면 새 트랜잭션을 시작합니다.

이런 상황에서 전파행위 옵션으르 고려하는 것이다.

Controller : 가공처리
DTO : Controller - Service 사이 오가는 것
Entity : Service - Repository(DAO) 오가는 것

 

NESTED 옵션 예시

  • 중첩 트랜잭션 활용: 대량 데이터 배치 처리 시, 예를 들어 100만 개의 업무를 10만 개씩 처리하며 중간에 문제가 발생하면 해당 부분만 롤백할 수 있습니다.
  • 주의사항: 세이브포인트를 지원하지 않는 환경에서는 사용 불가능합니다.

격리 수준 (Isolation Level)

  • DEFAULT: DB의 기본 격리 수준을 사용합니다. 대부분의 DBMS에서는 READ_COMMITTED가 기본 설정입니다.
  • READ_UNCOMMITTED: 커밋되지 않은 데이터를 읽을 수 있어, 오염된 값 읽기, 재현 불가능한 값 읽기, 허상 읽기 등의 문제가 발생할 수 있습니다.
  • READ_COMMITTED: 커밋된 데이터만 읽을 수 있어 오염된 값 읽기 문제는 해결되지만, 재현 불가능한 값 읽기 및 허상 읽기 문제는 여전히 존재합니다.
  • REPEATABLE_READ: 트랜잭션 동안 동일한 값을 읽도록 보장하며, 오염된 값 읽기 및 재현 불가능한 값 읽기 문제를 해결하지만 허상 읽기는 여전히 발생할 수 있습니다.
  • SERIALIZABLE: 트랜잭션 동안 동일한 로우를 읽도록 보장하며, 동시성 문제는 모두 해결되지만 성능이 저하될 수 있습니다.

동시성 문제 설명

  • 오염된 값: 커밋되지 않은 데이터를 다른 트랜잭션이 읽을 수 있어, 롤백 시 해당 데이터가 유효하지 않게 되는 상황입니다.
  • 재현 불가능한 값 읽기: 하나의 트랜잭션이 데이터를 수정한 후, 다른 트랜잭션이 그 데이터를 읽어 재현 불가능한 값이 되는 상황입니다.
  • 허상 읽기: 트랜잭션 동안 테이블의 로우가 추가되어 처음 읽은 데이터와 달라지는 상황입니다.