일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 싱글톤 패턴
- 스프링 컨테이너
- 전략 패턴
- k번째큰수
- 자바의 면접
- 리버스 프록시
- 참조형 매개변수
- 스프링
- www.naver.com치면 발생하는일
- SOLID원칙
- @Tranctional
- 옵저버 패턴
- Class Loader
- 스프링 빈
- TCP/IP 4계층
- try-catch
- 백준 2164
- 포워드 프록시
- 네트워크
- removeAll
- 쇠막대기
- mvvm패턴
- 빈 타입 조회
- 스프링 싱글톤
- 후위표기식
- 참조형 반환타입
- 기본형 매개변수
- 팩토리패턴
- 백준 1935
- 팩토리 패턴
- Today
- Total
스파이더 웹 개발
@Transactional 알고 쓰자 본문
@Transactional에 대해 알고 사용했을까..? rollback이 된다는 것 말고는 깊게 알지못하였다. 이번에 코드리뷰 멘토링을 통해 해당 내용에대해 알고써야하는것을 알게되었기에 이렇게 정리하게되었다.
트랜잭션이란?
데이터베이스 상태를 변경하는 작업 또는 한번에 수행되어야 하는 연산들을 의미
하나의 트랜잭션은 Commit 되거나 Rollback 된다
- Commit 연산
- 한개의 논리적 단위(트랜잭션)에 대한 작업이 성공적으로 끝나 데이터베이스가 다시 일관된 상태가 되었을 때, 이 트랜잭션이 행한 갱신 연산이 완료된 것을 트랜잭션 관리자에게 알려주는 연산이다
- Rollback 연산
- 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 이 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소하는 연산이다
- Rollback시에는 해당 트랜잭션을 재시작하거나 폐기한다
트랜잭션의 성질(ACID)
원자성
- 트랜잭션의 모든 연산들은 정상적으로 수행 완료되거나 아니면 전혀 어떠한 연산도 수행되지 않은 상태를 보장해야 한다.
일관성
- 트랜잭션 완료 후에도 데이터베이스가 일관된 상태로 유지되어야 한다.
독립성
- 하나의 트랜잭션이 실행하는 도중에 변경한 데이터는 이 트랜잭션이 완료될 때까지 다른 트랜잭션이 참조하지 못한다.
지속성
- 성공적으로 수행된 트랜잭션은 영원히 반영되어야 한다.
@Transactional 옵션
1. isolation
@Transactional 의 isolation 은 트랜잭션에서 일관성이 없는 데이터를 허용하도록 하는 수준
Spring 의 @Transactional 에서는 총 5가지 isolation 옵션을 제공합니다.
1-1 DEFAULT
- 기본이며, DB의 lsolation Level을 따른다.
1-2 READ_UNCOMMITTED (level 0) : 커밋되지 않는 데이터에 대한 읽기를 허용
- 어떤 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 B라는 아직 완료되지 않은(Uncommitted 혹은 Dirty)데이터 B를 읽을 수 있다.
- Dirty Read 발생
1-3 READ_COMMITED (level 1) : 커밋된 데이터에 대해 읽기 허용
- 어떠한 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 해당 데이터에 접근할 수 없다.
- Dirty Read 방지
1.4 REPEATEABLE_READ (level 2) : 동일 필드에 대해 다중 접근 시 모두 동일한 결과를 보장
- 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정이 불가능하다.
- 선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 후행 트랜잭션이 갱신하거나 삭제가 불가능 하기 때문에 같은 데이터를 두 번 쿼리했을 때 일관성 있는 결과를 리턴한다.
- Non-Repeatable Read 방지
1.5 SERIALIZABLE (level 3) : 가장 높은 격리, 성능 저하의 우려가 있음
- 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 Level
- 완벽한 읽기 일관성 모드를 제공한다.
- 따라서, 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능하다.
- Phantom Read 방지

Dirty Read
- 트랜잭션 1이 수정중인 데이터를 트랜잭션 2가 읽을 수 있다. 만약 드랜잭션 1의 작업이 정상 커밋되지 않아 롤백되면, 트랜잭션 2가 읽었던 데이터는 잘못된 데이터가 되는 것이다.
Non-repeatable read
- 트랜잭션 1이 회원 A를 조회중에 트랜잭션 2가 회원 A의 정보를 수정하고 커밋한다면, 트랜잭션 1이 다시 회원A를 조회했을 때는 수정된 데이터가 조회된다. (이전 정보를 다시 조회할 수 없음). 이처럼 반복해서 같은 데이터를 읽을 수 없는 경우이다.
Phantom read
- 트랜잭션 1이 10살 이하의 회원을 조회했는데 트랜잭션 2가 5살 회원을 추가하고 커밋하면 트랜잭션 1이 다시 10살 이하 회원을 조회했을 때 회원 한명이 추가된 상태로 조회된다. 이처럼 반복 조회시 결과집합이 달라지는 경우이다.
2. propagation (전파속성)
2.1 REQUIRED (Defualt)
- 이미 진행중인 트랜잭션이 있다면 해당 트랜잭션 속성을 따르고, 진행중이 아니라면 새로운 트랜잭션을 생성한다.
2.2 REQUIRES_NEW
- 항생 새로운 트랜잭션을 생성한다. 이미 진행중인 트랜잭션이 있다면 잠깐 보류하고 해당 트랜잭션 작업을 먼저 진행한다
2.3 SUPPORT
- 이미 진행 중인 트랜잭션이 있다면 해당 트랜잭션 속성을 따르고, 없다면 트랜잭션을 설정하지 않는다.
2.4 NOT_SUPPORT
- 이미 진행중인 트랜잭션이 있다면 보류하고, 트랜잭션 없이 작업을 수행한다.
2.5 MANDATORY
- 이미 진행중인 트랜잭션이 있어야만, 작업을 수행한다. 없다면 Exception을 발생시킨다.
2.6 NEVER
- 트랜잭션이 진행중이지 않을 때 작업을 수행한다. 트랜잭션이 있다면 Exception을 발생시킨다.
2.7 NESTED
- 진행중인 트랜잭션이 있다면 중첩된 트랜잭션이 실행되며, 존재하지 않으면 REQUIRED와 동일하게 실행된다.
3. noRollbackFor (예외무시)
특정예외 발생 시 Rollback 처리 하지 않음
4. rollbackFor (예외추가)
특정 예외 발생 시 강제로 Rollback
5.readOnly (읽기전용)
true 시 insert, update, delete 실행 시 예외 발생
Default = flase
6. timeout (시간지정)
지정한 시간 내에 해당 메소드 수행이 완료되지 않을 경우 rollback 수행
-1일 경우 no timeout
Default = -1
참고
https://bcp0109.tistory.com/322 <
https://velog.io/@kdhyo/JavaTransactional-Annotation-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-26her30h
https://taetaetae.github.io/2016/10/08/20161008/