Transaction의 특징
더보기
원자성
한 트랜잭션 안에서 실행되어야 할 로직이 모두 실행되거나, 모두 실행되지 않아야 한다
일관성
트랜잭션이 종료 된 후에도 일관성 있게 데이터베이스의 제약 조건을 만족 해야한다.
격리성
여러개의 트랜잭션이 동시에 실행 될때 , 각각의 트랜잭션은 독립적이여야 하며
이 뜻은 각각의 트랜잭션은 서로 방해 받지 않아야 한다.
지속성
트랜잭션이 성공적으로 종료되게 된다면 commit 하여 DB에 영속화 되어야 한다
Transaction의 전파
더보기
REQUIRED(기본 값)
이미 트랜잭션이 존재한다면, 해당 트랜잭션을 따르고 존재하지 않는다면 새로운 트랜잭션 생성
REQUIRES_NEW
항상 새로운 트랜잭션을 만들고, 만약 트랜잭션이 이미 존재한다면 기존 트랜잭션을 보류 시킨다.
SUPPORT
이미 트랜잭션이 존재하면 그것에 트랜잭션 속성을 따르고, 만약 존재 하지않으면 트랜잭션을 사용하지 않는다
NOT_SUPPORT
이미 트랜잭션이 존재하면 보류 시키고, 없으면 트랜잭션을 사용하지 않는다
MANDATORY
이미 다른 트랜잭션이 있어야 하며 없다면 예외 발생
NEVER
트랜잭션이 없을때 실행, 있으면 예외 발생
NESTED
이미 트랜잭션이 존재하면 중첩 트랜잭션을 시작한다. 없다면 REQUIRED와 동일
여기서 중요한 점은 부모 트랜잭션이 롤백시 중첩 트랜잭션도 롤백
중첩 트랜잭션도 롤백시 부모 트랜잭션은 정상적으로 커밋 된다
Transaction의 격리(isolation)
더보기
READ_UNCOMMITED
트랜잭션이 처리 중이거나 아직 커밋되지 않은 데이터를 다른 트랜잭션에서 읽을 수 있다.
이것은 문제로는 Dirty Read 가 발생할 수 있다.
READ_COMMITED
위 UNCOMMITED의 Dirty Read를 방지하기 위한 것으로,
트랜잭션이 커밋된 데이터만 다른 트랜잭션에서 읽을 수 있다.
REPEATABLE_READ
처음 SELECT 가 수행한 시간을 기록하여, 그 이후 모든 SELECT 요청시 마다 해당 시간을 기점으로
Read를 수행하여 항상 일관성 있는 응답을 할 수있으며,
lock을 사용하는 SELECT , UPDATE, DELETE 쿼리를 실행 시 gap lock을 사용하여
다른 트랜잭션에서 접근을 하지 못하게 한다
SERIALIZE
가장 강력한 레벨이며,
모든 SELECT 쿼리가 전부 SELECT ... FOR SHARE 로 자동 변경되며,
SHARE LOCK 이 걸리게 된다
참조 : https://suhwan.dev/2019/06/09/transaction-isolation-level-and-lock/
'language > Spring' 카테고리의 다른 글
Spring Batch && Scheduler (0) | 2022.08.10 |
---|---|
[JPA] Native Query to DTO 맵핑 (0) | 2022.05.15 |
[Spring Security] Spring Security 이란? (0) | 2022.05.01 |
[Spring] Spring MVC 패턴 & Model2 방식 (0) | 2022.05.01 |