Framework/Spring Boot

트랜잭션

잔망루피 2022. 10. 26. 19:56

⭐ 트랜잭션

  • DB 상태를 변환시키는 한 번에 수행되어야 할 일련의 연산 수행 단위
  • 작업을 수행하던 도중 문제가 발생하면 이전에 진행되었던 작업도 취소됨
  • Rollback
    • 트랜잭션이 비정상적으로 종료되면 모든 연산을 취소해서 DB에 반영하지 않음
  • 커밋
    • 트랜잭션의 작업이 정상적으로 끝나면 DB에 반영
  • 성질
    • Atomicity
      • 하나의 트랜잭션은 최소의 단위
    • Consistency
      • 트랜잭션의 일부가 DB에 commit되었을 때 트랜잭션의 범위에 있는 다른 연산들도 commit 되는 것을 보장
    • Isolation
      • 다른 트랜잭션의 연산작업이 기존 작업에 영향을 주지 못한다.
    • Durability
      • 트랜잭션을 처리한 후 DB에 반영된 내용은 영원히 지속됨
  • 상태
    • Active
      • 진행 중
    • Partially Committed
      • 연산을 모두 처리 후 DB에 반영되기 전
    • Commited
      • DB에 반영됨
    • Failed
      • 장애로 인해 트랜잭션이 중단됨
    • Aborted
      • Rollback 연산을 실행

 

트랜잭션이 적용될 타깃 인터페이스나 클래스, 메소드 등에 @Transactional 애노테이션을 부여해서 트랜잭션 대상으로 지정하고 트랜잭션의 속성을 제공

인터페이스에 붙은 @Transactional 선언은 인터페이스 내의 모든 메소드에 적용됨.

동시에 메소드 레벨에도 @Transactional을 지정할 수 있고, 메소드의 선언이 인터페이스의 선언보다 우선시 됨.

 

🐂 Spring의 트랜잭션의 속성

  1. 트랜잭션 전파(transaction propagation)
  2. 격리수준(isolation level)
  3. 제한시간
  4. 읽기전용
트랜잭션 전파 트랜잭션의 경계에서 이미 진행 중인 트랜잭션이 있을 때 또는 없을 때 어떻게 동작할 것인가를 결정하는 방식
격리수준 적절하게 격리수준을 조정해서 가능한 한 많은 트랜잭션을 동시에 진행시키면서도 문제가 발생하지 않게 하는 제어가 필요
DefaultTransactionDefinition에 설정된 격리수준은 ISOLATION_DEFAULT
제한시간 트랜잭션을 직접 시작할 수 있는 PROPAGATION_REQUIRED나 PROPAGATION_REQUIRES_NEW와 함께 사용해야만 의미가 있다.
읽기전용 @Transactional(readOnly=true)
트랜잭션이 전파되는 중간에 변경 불가능
트랜잭션 내에서 데이터를 조작하는 시도를 막아줄 수 있다.
데이터 엑세스 기술에 따라서 성능이 향상 될 수도 있다.

 

⭐ 트랜잭션 격리수준

  • READ-UNCOMMITTED
    • 대부분 DB에서 기본값
    • 커밋 전의 트랜잭션의 데이터 변경 내용을 다른 트랜잭션이 읽을 수 있음
  • READ-COMMITED
    • 커밋이 완료된 데이터만 다른 트랜잭션에서 조회할 수 있음
  • REPEATABLE-READ
    • 트랜잭션 범위 내에서 조회한 내용이 항상 동일함
  • SERIALIZABLE
    • 한 트랜잭션에서 사용하는 데이터는 다른 트랜잭션에서 접근할 수 없음

 

🌿 트랜잭션 전파 속성

  1. PROPAGATION_REQUIRED
  2. PROPAGATION_REQUIRES_NEW
  3. PROPAGATION_NOT_SUPPORTED
PROPAGATION_REQUIRED 가장 많이 사용되는 트랜잭션 전파 속성
부모 트랜잭션이 있으면 합류하고 없으면 새로운 트랜잭션 생성
DefaultTransactionDefinition의 트랜잭션 전파 속성은 바로 이 PROPAGATION_REQUIRED
PROPAGATION_REQUIRES_NEW 항상 새로운 트랜잭션을 시작
각각의 트랜잭션이 롤백된다면 서로 영향을 주지 않음
PROPAGATION_NOT_SUPPORTED 트랜잭션 없이 동작하도록 만들 수도 있다.
진행 중인 트랜잭션이 있어도 무시한다.

 

🌍 특별한 메소드만 트랜잭션 적용에서 제외하려면 어떻게 할까?

모든 메소드에 트랜잭션 AOP가 적용되게 하고, 특정 메소드의 트랜잭션 전파 속성만 PROPAGATION_NOT_SUPPORTED로 설정해서 트랜잭션 없이 동작하게 만드는 편이 낫다.

 

 

트랜잭션이 완료되지 않아도 API 응답이 성공으로 올 수 있을까?

가능하다.

트랜잭션이 완전히 끝나지 않아도 API 응답이 성공으로 올 수 있다.

트랜잭션이 완전히 다 처리되기 전에 API가 성공 응답을 보내도록 설계되었을 때 발생할 수 있다.

 

 

 

참고 👉 도서 토비의 스프링 3.1

 

https://tecoble.techcourse.co.kr/post/2021-07-11-database-transaction/

 

Database Transaction

트랜잭션 이란? SQL을 사용하여 INSERT나 UPDATE 명령을 사용할 때 COMMIT을 해주어야 실제 데이터베이스에 반영이 된다. 트랜잭션에 대하여 아직 깊게 공부하지 않은 사람이라면 ‘나는 COMMIT…

tecoble.techcourse.co.kr

 

https://www.youtube.com/watch?v=aX9c7z9l_u8 

 

반응형