Spring, Spring boot

트랜잭션

ron_nie 2023. 10. 26. 09:32
728x90

트랜잭션

트랜잭션이란?

데이터베이스 안에서 수행되는 작업 단위, 여러개의 데이터베이스 연산(CRUD)을 하나의 논리적인 작업 단위로 묶어서 실행하는 것
이 때, 모든 연산이 성공적으로 수행되면 트랜잭션을 커밋하여 데이터베이스에 반영하고, 하나라도 실패하면 롤백함

사용

트랜잭션의 목적은 데이터베이스 서버에 여러 개의 클라이언트가 동시에 엑세스 하거나 응용프로그램이 갱신을 처리하는 과정에서 중단될 수 있는 경우 등 데이터 부정합을 방지하고자 할때 , 쉽게 이야기하면 여러 작업을 묶을 때 사용

잠금 vs 트랜잭션

트랜잭션

트랜잭션은 작업의 완전성을 보장해주는 것. 즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생되지 않게 만들어주는 기능
데이터의 정합성을 보장하기 위한 기능

잠금

트랜잭션과 비슷하지만 동시성을 제어하기 위한 기능

트랜잭션의 성질

    1. 원자성
      1. 하나의 트랜잭션이 더 이상 작게 쪼갤 수 없는 최소한의 업무 단위
      2. 트랜잭션의 연산은 데이터베이스에 모두 반영되던지, 아니면 전혀 반영되지 않아야함
    2. 일관성
      1. 트랜잭션이 실행을 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환
      2. 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 완료 후의 상태가 같아야한다
    3. 독립성
      1. 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행 중에 다른 트랜잭션의 연산이 끼어들 수 없다
      2. 수행중인 트랜잭션은 완전이 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다
    4. 영속성
      1. 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야한다


@Transactional

주의점

클래스 메서드에 선언된 트랜잭션의 우선순위가 가장 높고 인터페이스에 선언된 트랜잭션 우선순위가 가장 낮음

Content 클래스 메소드 -> 클래스 -> 인터페이스 메소드 -> 인터페이스

우선 순위

즉 공통적인 트랜잭션 규칙은 클래스에, 특별한 규칙은 메서드에 선언한다
또한 인터페이스보다는 클래스에 적용할 것을 권고한다. 인터페이스나 인터페이스의 메서드에 적용할 수 있지만 이럴 경우 인터페이스 기반 프록시에서만 유효한 트랜잭션 설정이 된다.
자바 어노테이션은 인터페이스로부터 상속되지 않기 때문에 클래스 기반 프록시에서 트랜잭션 설정을 인식할 수 없다

@Transactional 과 JPA

트랜잭션 범위 내의 1차 캐시

  • 1차 캐시는 영속성 컨텍스트 내부에 존재하는 캐시로, 엔티티를 조회하면 그 결과를 저장
  • 이후 같은 엔티티를 조회하면 캐시가 먼저 조회하게 되므로 데이터베이스를 접근하지 않고도 빠르게 가져올 수 있음트랜잭션 범위 내의 Dirty Checking
  • 매번 영속성 컨텍스트를 확인하여 변경 사항이 있는지 감지하고 엔티티의 개수만 큼 UPDATE 쿼리가 실행되므로, 엔티티 개수가 많은 경우에는 오버헤드 발생@Transactional 의 모드
  • 기본값 : Proxy Mode
    • 반드시 public 메서드에 적용 되어야함
      • 그 외의 Protected, Private Method 에서는 오류는 안나지만 실행되지 않는다
      • Non-Public 메서드에 적용하고 싶으면 AspectJ Mode를 고려해야한다.
    • @Transactional이 적용되지 않은 Public Method에서 @Transactional이 적용된 Public Method를 호출할 경우, 트랜잭션이 동작하지 않는다.@Transactional 설정![![/#^Table]]
반응형