🌼트랜잭션
여러개의 작업들을 하나의 그룹으로 묶어서 처리하는 처리 단위
물리적으로는 여러개의 작업이지만 논리적으로는 마치 하나의 작업으로 인식해서 전부 성공 or 전부 실패로만 처리
로컬트랜잭션 / 분산 트랜잭션으로 나뉨
로컬 트랜잭션 : 하나의 자원관리자(데이터베이스)가 참여하는 트랜잭션
분산 트랜잭션 : 하나 이상의 자원관리자(데이터베이스)와
하나 이상의 물리적인 사이트가 하나의 논리적인 단위로 참여하는 트랜잭션
데이터베이스와 관련없는 행위도 여러 작업이 원자성을 가지고 처리되어야 한다면 하나의 트랜잭션으로 볼 수 있음
ex) 파일생성 및 업로드 , 이메일 전송, 메시지 전송
🌼ACID원칙
1. 원자성
작업을 더이상 쪼갤 수 없음 , 하나의 작업으로 인식해서 둘다 성공하거나 둘다 실패하거나 둘중 하나의 처리결과
commit실행시에 DB에 영구적으로 저장하는것은 DBMS가 담당하는 부분
rollback실행시 되돌리는것도 DBMS가 담당하는 부분
개발자는 언제 commit하거나 rollback 할 지를 챙겨야함(트랜잭션의 단위, 어떤문제가 생겼을때 실행할지)
2. 일관성
비즈니스 로직에서 의도하는대로 일관성있게 저장되거나 변경되어야 함
3. 격리성
여러 개의 트랜잭션이 실행될 경우 각각 독립적으로 실행이 되어야 함
4. 지속성
트랜잭션이 완료되면 그 결과는 지속되어야 함
데이터베이스가 종료되어도 데이터는 물리적인 저장소에 저장되어 지속적으로 유지되어야함
🌼트랜잭션 커밋과 롤백
커밋(commit)
모든 작업을 최종적으로 데이터베이스에 반영하는 명령어
변경된 내용이 데이터베이스에 영구적으로 저장
commit명령을 수행 -> 하나의 트랜잭션 과정은 종료
롤백(rollback)
작업중 문제가 발생했을때 수행된 작업들을 취소해서 트랜잭션 시작 이전의 상태로 되돌아감
🌼선언형 방식의 트랜잭션
1. 애너테이션 추가하는 방식
@Transactional
클래스 내에 메서드가 많으면 클래스레벨에 붙이는게 바람직하고
클래스 내에 조회하는 메서드가 적다면 메서드 각각에 붙이는게 바람직함
@Transactional(readOnly = true)
조회메서드에 readOnly = true로 지정해주면 JPA시 영속성컨텍스트를 flush하지 않음
성능 최적화 과정 지정하는 것(읽기 전용 속성)
@Transactional 우선순위
메서드레벨 > 클래스레벨
🍀트랜잭션 전파(Transaction Propagation)
트랜잭션의 경계에서 진행중인 트랜잭션이 존재할때 또는 존재하지 않을 때,어떻게 동작할 것인지 결정하는 방식
propagation 애트리뷰트로 설정
1.Propagation.REQUIRED 기본값
2.Propagation.REQUIRES_NEW
3.Propagation.MANDATORY
4.Propagation.NOT_SUPPORTED
5.Propagation.NEVER
🍀트랜잭션 격리 레벨(Isolation Level)
트랜잭션은 격리성이 보장되어야 함(다른 트랜잭션에 영향을 주지 않고, 독립적으로 실행)
Isolation 애트리뷰트
1. Isolation.DEFAULT
2. Isolation.READ_UNCOMMITTED
3. Isolation.READ_COMMITTED
4. Isolation.REPEATABLE_READ
5. Isolation.SERIALIZABLE
🌟체크예외(checked exeption)는 rollback이 잘 될까?
@Transactional 애너테이션만 추가한다고 rollback이 되지않음
(예외를 catch해서 해당 예외를 복구할지 회피할지등 전략으로 체크해야함)
ex) Exception, SQLException, DataFormatException
✔별도의 예외전략을 짤 필요가 없다면
@Transactional(rollbackFor = {SQLException.class, DataFormatException.class}) 처럼
해당 체크예외를 직접 지정하거나 언체크예외(unchecked exception)으로 감싸서 rollback이 동작하도록 할수있다
2. AOP 방식
AOP방식 이용하여 비즈니스 로직에서 트랜잭션 적용코드 자체를 감추는 방식
'개발공부🌷 > Spring MVC' 카테고리의 다른 글
Spring MVC 테스팅(Testing) 2 (0) | 2023.12.06 |
---|---|
Spring MVC 테스팅(Testing) (0) | 2023.12.06 |
Spring MVC JPA 2 (0) | 2023.11.28 |
Spring MVC JPA (0) | 2023.11.28 |
Spring MVC Data JPA (0) | 2023.11.27 |