거인의 코딩일지
선언적 트랜잭션? @Transctional? JPA? Proxy? 본문
728x90
선언적 트랜잭션 ( @Transctional )
- 소스코드에 직접 트랜잭션 관련 로직을 넣어두지 않고 비지니스 로직에서 완전히 분리 하는 방식이다
- 프로그래밍에 의한 트랜잭션에서 나온 단점인 트랜잭션 코드 중복문제, 소스코드 유지보수의 문제를 모두 해결 가능
- 트랜잭션이라는 횡단 관심사를 비지니스 로직에서 완전히 분리하기 때문에 SRP 관점에서 봤을 때도 적합하고 많은양의 트랜잭션 로직을 적용하기에도 합리적
트랜잭션의 격리 수준 (Isolation Level)
- DEFAULT : 데이터베이스에서 설정된 기본 격리 수준을 따른다
- READ UNCOMMIT
- 트랜잭션에서 처리 중인, 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용
- Dirty Read, Non-Repeatable Read, Phantom Read 현상 발생
- READ COMMIT
- Dirty Read 방지 : 트랜잭션이 커밋되어 확정된 데이터만 읽는 것을 허용
- 대부분의 DBMS가 기본모드로 채택하고 있는 일관성모드
- Non-Repeatable Read, Phantom Read 현상은 여전히 발생
- REPEATABLE READ
- 선행된 트랜잭션이 종료될 때 까지 다른 트랜잭션은 그 영역에 해당하는 데이터를 수정 할 수 없음
- Phantom Read 현상은 여전히 발생
- SERIALIZABLE READ
- 가장 엄격한 트랜잭션 격리 수준으로 완벽한 읽기 일관성을 제공한다
- 신형 트랜잭션이 읽은 데이터를 후행 트랜잭션이 갱신하거나 삭제하지 못할 뿐만 아니라 중간에 새로운 레코드를 산입하는 것도 막아줌
- 이 격리 수준에서는 Phantom Read 상태가 발생하지 않지만 동시성 처리 성능이 급격히 떨어질 수 있다.
Dirty Reads?
- Dirty Reads 란?, 동시에 진행되고 있는 다른 트랜잭션(아직 커밋하지 않은 상태)에서 변경한 데이터를 현재 진행 중인 트랜잭션에서 읽어 들이는 것을 말한다.
Non-repeatable Reads?
- Non-repeatable Read란, 하나의 트랜잭션 중 읽어 들였던 특정 row의 값을 같은 트랜잭션 내에서 다시 읽어 들이는데 중간에 변경사항이 생겨 (실제로COMMIT이 된 변경사항) 결괏값이 다르게 나오는 현상을 뜻합니다.
Phantom Reads?
- Phantom read란, 트랜잭션 시작 시점 데이터를 읽었을 때 존재하지 않았던 데이터가 다시 같은 조건으로 데이터를 읽어 들였을 때 존재해 (유령처럼) INCONSISTENT 한 결괏값을 반환하는 현상을 뜻합니다.
JPA의 @Transaction 과 Proxy
- JPA 의 @Transaction 은 Proxy 형태로 동작
- Proxy 형태로 동작하기에 Private method 에 적용 불가하고 같은 class 안의 method에서 다른 method 를 호출했을 때 중첩 Transaction 이 동작하지 않는다.
(무조건 진입점의 Transaction 기준으로 동작한다.)
728x90
'코딩 > JAVA' 카테고리의 다른 글
[JPA] N+1 문제?? (2) | 2023.08.31 |
---|---|
[JPA] 영속성 컨텍스트란? (0) | 2023.08.24 |
[JPA] JPA(Java Persistenence API) 란????? (0) | 2023.08.22 |
[Spring] @NoArgsConsructor, @RequiredArgsConstructor, @AllArgsConstructor (0) | 2023.08.22 |
Math.sqrt() 제곱근 구하기 (0) | 2023.08.14 |