My Melody Is Cute Spring MVC 트랜잭션(Transaction)
본문 바로가기

개발공부🌷/Spring MVC

Spring MVC 트랜잭션(Transaction)

🌼트랜잭션

여러개의 작업들을 하나의 그룹으로 묶어서 처리하는 처리 단위

물리적으로는 여러개의 작업이지만 논리적으로는 마치 하나의 작업으로 인식해서 전부 성공 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