[ 2022.10.30 TIL-Spring 트랜젝션 처리 ]

Coosla·2022년 10월 30일
0

TIL

목록 보기
8/29
post-thumbnail

트랜잭션

✏️ 트랜잭션이란?

  • 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위

✏️ 트랜잭션의 특징

  • 원자성(Atomicity)
    • 한 트랜잭션 내에서 실행한 작업들은 하나로 간주
    • 작업들이 전부 성공하거나 모두 실패
  • 일관성(Consistency)
    • 트랜잭션이 성공했다면 데이터베이스의 모든 데이터는 일관성 유지
  • 격리성(Isolation)
    • 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리
  • 지속성(Durability)
    • 트랜잭션을 성공적으로 마치면 결과가 항상 저장

✏️ @Transactional 어노테이션

  • 스프링에서 트랜잭션을 처리하는 기능을 지원
  • 클래스나 메소드 위에 @Transactional 어노테이션 추가
  • 어노테이션을 추가하면 트랜잭션 기능이 적용된 프록시 객체가 생성되어 호출이 들어올 때 PlatformTransactionManager를 사용하여 트랜잭션을 시작하고, 정상 여부에 따라 Commit/Rollback을 함
  • 형태
    // 클래스에서 트랜잭션 기능 사용
    @Transactional
    public class 클래스명{
    	...
    }
    // 메소드에서 트랜잭션 기능 사용
    @Transactional
    public 반환타입 메소드명(매개변수){
    	...
    }
  • 격리 수준
    • 격리 수준이 올라갈수록 성능 저하 우려가 있음
    • DEFAULT
      • 기본 격리 수준
    • READ_UNCOMMITTED (Level 0)
      • 커밋되지 않는 데이터에 대한 읽기를 허용
      • 오손 읽기 발생
    • READ_COMMITTED (Level 1)
      • 트랜잭션이 커밋된 확정 데이터만 읽기 허용
      • 오손 읽기 방지
    • REPEATABLE_READ (Level 2)
      • 트랜잭션이 완료될 때까지 Select 문장이 사용되는 모든 데이터에 Shared Lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정이 불가능
      • 반복 불가능 읽기 방지
    • SERIALIZABLE (Level 3)
      • 데이터의 일관성 및 동시성을 위해 MVCC(Multi Version Concurrency Control)를 사용하지 않음
      • 유령 데이터 읽기 방지
  • 전파옵션
    • REQUIRED
      • 기본 속성이며 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성
    • SUPPORTS
      • 이미 시작된 트랜잭션이 있으면 참여하고 그렇지 않으면 트랜잭션 없이 진행
    • REQUIRES_NEW
      • 부모 트랜잭션을 무시하고 무조건 새로운 트랜잭션이 생성
      • 이미 진행 중인 트랜잭션이 있으면 트랜잭션을 잠시 보류
    • MANDATORY
      • REQUIRED와 비슷하게 이미 시작된 트랜잭션이 있으면 참여
      • 트랜잭션이 시작된 것이 없으면 예외를 발생
      • 혼자서는 독립적으로 트랜잭션을 진행하면 안되는 경우 사용
    • NOT_SUPPORTED
      • 트랜잭션을 사용하지 않게 함
      • 이미 진행중인 트랜잭션이 있으면 보류
    • NAVER
      • 트랜잭션을 사용하지 않고록 강제
      • 진행 중인 트랜잭션이 존재하면 예외 발생
    • NESTED
      • 진행중인 트랜잭션이 있으면 중첩 트랜잭션을 시작
  • readOnly 속성
    • 트랜잭션을 읽기 전용으로 설정
    • 읽기 전용 트랜잭션이 시작된 후 쓰기 작업이 진행되면 예외 발생
  • rollbackFor 속성
    • 특정 예외가 발생 시 강제로 롤백
  • noRollbackFor 속성
    • 특정 예외가 발생 시 롤백으로 처리되지않음
  • timeout속성
    • 지정한 시간 내에 해당 메소드 수행이 완료되지 않는 경우 롤백

✏️ 트랜잭션들이 동시에 실행될 경우 발생하는 문제

  • 오손 읽기 (Dirty Read)
    • 트랜잭션 A가 작업 후 커밋을 하지 않은 상태에서 트랜잭션 B가 해당 데이터를 읽어와서 트랜잭션 B는 트랜잭션 A에서 커밋하기 전 데이터가 옳다고 판단하는 경우
  • 반복 불가능 읽기 (Non-Repeatable Read)
    • 트랜잭션 A는 수정 전 데이터를 알고있는 상태에서 트랜잭션 2가 수정한 데이터 값을 읽게 되는 경우
  • 유령 데이터 읽기 (Phantom Read)
    • 트랜잭션 A가 신규 데이터를 추가 하고 Commit했을 때 트랜잭션 B는 원래 존재하지 않은 트랜잭션 A에서 추가한 데이터를 보게되는 경우

참고

트랜잭션

profile
프로그래밍 언어 공부 정리

0개의 댓글