@Transactional

허준기·2024년 1월 30일
0

스프링

목록 보기
5/7

트랜잭션

단일 작업 단위로 실행되는 하나 이상의 데이터베이스 작업 시퀀스. ACID 원칙을 적용해 데이터 일관성과 무결성 보장

ACID

Atomicity(원자성)

원자적이어서 분할할 수 없는 단일 작업 단위로 취급
트랜잭션이 어느 시점에서든 실패하면 DB에 적용된 모든 변경 사항이 롤백되고 데이터베이스는 원래 상태로 돌아감

Consistency(일관성)

-> 트랜잭션이 실행되기 전과 후에 모두 유효한 상태여야 함.
트랜잭션이 기본 키 또는 외래 키 제약 조건과 같은 DB 제약 조건을 위반하는 경우 롤백

Isolation(격리성)

다중 사용자 환경에서 트랜잭션이 동시에 실행되므로,
각 트랜잭션이 격리되어 다른 트랜잭션의 결과에 영향을 미치지 않도록 하는 것이 중요

Durability(영속성)

커밋되면 DB에 대한 변경 내용이 영구적으로 유지되어야 함.
시스템 충돌이나 정전과 같은 후속 장애에도 영향을 받지 않아야 함

@Transactional

선언적 데이터베이스 트랜잭션 관리 방법 제공
메서드 또는 클래스 레벨에서 사용. 해당 메서드 또는 클래스의 모든 public 메서드에 트랜잭션 적용
  • 해당하는 메서드를 실행할 때 트랜잭션을 시작하고, 메서드가 정상적으로 종료되면 트랜잭션을 commit하고, 예외가 발생하면 트랜잭션을 rollback
    → 비정상적 종료로 인한 rollback이 발생할 경우 트랜잭션의 일부 작업만 DB에 반영되는 것을 방지해 데이터 일관성 유지

동작 원리

  • 클래스, 메서드에 @Transactional이 선언되면 해당 클래스에 트랜잭션이 적용된 프록시 객체 생성
  • 프록시 객체@Transactional이 포함된 메서드가 호출될 경우, 트랜잭션을 시작하고 Commit or Rollback을 수행
  • CheckedException or 예외가 없을 때는 Commit
  • UncheckedException이 발생하면 Rollback

주의점

  1. 트랜잭션을 적용하려는 메서드는 반드시 public 선언
  2. - 프록시 객체로 외부에서 접근 가능한 인터페이스를 제공해야함 → private나 protected로 선언되어 있으면 프록시 객체가 생성될 때 해당 메서드에 접근 불가 → 트랜잭션 관리 불가능
  3. 다른 AOP 기능과의 충돌 고려
  4. - @Order을 이용해 적용 순서를 정하거나 적용범위 조정
  5. Service 계층에서 사용
  6. - Service 계층에서 @Transactional을 사용함으로써 여러 DB 작업들을 원자적으로 처리
  7. Exception 고려
  8. - 트랜잭션을 RuntimeException과 Error에서는 롤백되지만, Checked Exceptions 에서는 롤백되지 않음. Checked Exceptions 에서는 @Transactional에 rollbackFor 속성을 두어 롤백처리가 되도록 할 수 있음 @Transactional(rollbackFor = {Exception.class})
  9. 트랜잭션과 데드락

참고
https://imiyoungman.tistory.com/9

https://medium.com/gdgsongdo/transactional-%EB%B0%94%EB%A5%B4%EA%B2%8C-%EC%95%8C%EA%B3%A0-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-7b0105eb5ed6

https://colevelup.tistory.com/34

profile
나는 허준기

0개의 댓글