⭐ 트랜잭션
- DB 상태를 변환시키는 한 번에 수행되어야 할 일련의 연산 수행 단위
- 작업을 수행하던 도중 문제가 발생하면 이전에 진행되었던 작업도 취소됨
- Rollback
- 트랜잭션이 비정상적으로 종료되면 모든 연산을 취소해서 DB에 반영하지 않음
- 커밋
- 트랜잭션의 작업이 정상적으로 끝나면 DB에 반영
- 성질
- Atomicity
- 하나의 트랜잭션은 최소의 단위
- Consistency
- 트랜잭션의 일부가 DB에 commit되었을 때 트랜잭션의 범위에 있는 다른 연산들도 commit 되는 것을 보장
- Isolation
- 다른 트랜잭션의 연산작업이 기존 작업에 영향을 주지 못한다.
- Durability
- 트랜잭션을 처리한 후 DB에 반영된 내용은 영원히 지속됨
- Atomicity
- 상태
- Active
- 진행 중
- Partially Committed
- 연산을 모두 처리 후 DB에 반영되기 전
- Commited
- DB에 반영됨
- Failed
- 장애로 인해 트랜잭션이 중단됨
- Aborted
- Rollback 연산을 실행
- Active
트랜잭션이 적용될 타깃 인터페이스나 클래스, 메소드 등에 @Transactional 애노테이션을 부여해서 트랜잭션 대상으로 지정하고 트랜잭션의 속성을 제공
인터페이스에 붙은 @Transactional 선언은 인터페이스 내의 모든 메소드에 적용됨.
동시에 메소드 레벨에도 @Transactional을 지정할 수 있고, 메소드의 선언이 인터페이스의 선언보다 우선시 됨.
🐂 Spring의 트랜잭션의 속성
- 트랜잭션 전파(transaction propagation)
- 격리수준(isolation level)
- 제한시간
- 읽기전용
트랜잭션 전파 | 트랜잭션의 경계에서 이미 진행 중인 트랜잭션이 있을 때 또는 없을 때 어떻게 동작할 것인가를 결정하는 방식 |
격리수준 | 적절하게 격리수준을 조정해서 가능한 한 많은 트랜잭션을 동시에 진행시키면서도 문제가 발생하지 않게 하는 제어가 필요 DefaultTransactionDefinition에 설정된 격리수준은 ISOLATION_DEFAULT |
제한시간 | 트랜잭션을 직접 시작할 수 있는 PROPAGATION_REQUIRED나 PROPAGATION_REQUIRES_NEW와 함께 사용해야만 의미가 있다. |
읽기전용 | @Transactional(readOnly=true) 트랜잭션이 전파되는 중간에 변경 불가능 트랜잭션 내에서 데이터를 조작하는 시도를 막아줄 수 있다. 데이터 엑세스 기술에 따라서 성능이 향상 될 수도 있다. |
⭐ 트랜잭션 격리수준
- READ-UNCOMMITTED
- 대부분 DB에서 기본값
- 커밋 전의 트랜잭션의 데이터 변경 내용을 다른 트랜잭션이 읽을 수 있음
- READ-COMMITED
- 커밋이 완료된 데이터만 다른 트랜잭션에서 조회할 수 있음
- REPEATABLE-READ
- 트랜잭션 범위 내에서 조회한 내용이 항상 동일함
- SERIALIZABLE
- 한 트랜잭션에서 사용하는 데이터는 다른 트랜잭션에서 접근할 수 없음
🌿 트랜잭션 전파 속성
- PROPAGATION_REQUIRED
- PROPAGATION_REQUIRES_NEW
- 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/
https://www.youtube.com/watch?v=aX9c7z9l_u8
반응형
'Framework > Spring Boot' 카테고리의 다른 글
[Error] "The specified key byte array is 128 bits which is not secure enough for any JWT HMAC-SHA algorithm. (0) | 2022.12.09 |
---|---|
[Error] Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource (0) | 2022.12.08 |
Spring Security (0) | 2022.10.06 |
OAuth2User (0) | 2022.10.06 |
[Error] ModelMapper 매핑이 안될 때 (0) | 2022.10.05 |