728x90
트랜잭션
트랜잭션이란?
데이터베이스 안에서 수행되는 작업 단위, 여러개의 데이터베이스 연산(CRUD)을 하나의 논리적인 작업 단위로 묶어서 실행하는 것
이 때, 모든 연산이 성공적으로 수행되면 트랜잭션을 커밋하여 데이터베이스에 반영하고, 하나라도 실패하면 롤백함
사용
트랜잭션의 목적은 데이터베이스 서버에 여러 개의 클라이언트가 동시에 엑세스 하거나 응용프로그램이 갱신을 처리하는 과정에서 중단될 수 있는 경우 등 데이터 부정합을 방지하고자 할때 , 쉽게 이야기하면 여러 작업을 묶을 때 사용
잠금 vs 트랜잭션
트랜잭션
트랜잭션은 작업의 완전성을 보장해주는 것. 즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생되지 않게 만들어주는 기능
데이터의 정합성을 보장하기 위한 기능
잠금
트랜잭션과 비슷하지만 동시성을 제어하기 위한 기능
트랜잭션의 성질
- 원자성
- 하나의 트랜잭션이 더 이상 작게 쪼갤 수 없는 최소한의 업무 단위
- 트랜잭션의 연산은 데이터베이스에 모두 반영되던지, 아니면 전혀 반영되지 않아야함
- 일관성
- 트랜잭션이 실행을 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환
- 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 완료 후의 상태가 같아야한다
- 독립성
- 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행 중에 다른 트랜잭션의 연산이 끼어들 수 없다
- 수행중인 트랜잭션은 완전이 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다
- 영속성
- 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야한다
@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]]
- 반드시 public 메서드에 적용 되어야함
반응형
'Spring, Spring boot' 카테고리의 다른 글
Spring Boot3 와 테스트 (0) | 2023.12.24 |
---|---|
JPA를 활용한 기본적인 CRUD 해보기 (0) | 2023.10.26 |
JPA 동작원리 (0) | 2023.10.25 |
토큰 기반 인증 방식과 JWT (0) | 2023.10.19 |
스프링 시큐리티 (0) | 2023.10.18 |