데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위
CRUD 작업 모두 데이터베이스의 상태를 변화시키게 됨
속성에 대한 이해 필요
트랜잭션의 작업 처리 결과가
모두 DB에 반영 되거나,
모두 DB에 반영 되지 않아야 함.
트랜잭션의 작업 처리 결과는
항상 일관적이어야 한다.
여러개의 트랜잭션들이 하나의 DB에서 작업할 때
서로에게 영향을 미쳐선 안된다.
트랜잭션이 성공적으로 완료되어 DB에 변화가 생겼다면,
그 변화는 영구적이어야 한다.
트랜잭션이 성공적으로 작업을 완료했다고 판단하면
지금까지의 작업을 반영하겠다는 뜻으로 커밋을 수행 함
트랜잭션 과정 중 예외 상황이나 오류 같은 문제 상황이 발생했을 때
지금까지의 작업을 모두 작업 시작 전으로 되돌리겠다는 뜻으로 롤백을 수행 함
오호
경쟁을 한다
해당 부분에 대해 자세히 알아보기
Non Repeatable과 Phantom Read의 차이점도 알아보기
클래스, 메서드 위에 @Transactional
어노테이션을 추가할 수 있다.
+ 트랜잭션 사용 시
main() 메서드 품은 클래스에
@EnableTransactionManagement
추가해주어야 됨
트랜잭션에서 일관성이 없는 데이터를 허용하는 수준
@Transactional(isolation = Isolation.대문자_옵션)
Dirty Read
발생
한 트랜잭션이
아직 커밋되지 않은 다른 트랜잭션의
변경 내용을 읽을 수 있다.
이 말은
다른 트랜잭션이
아직 롤백되거나 커밋되지 않았음에도 불구하고
변경된 데이터를 읽을 수 있다는 얘기이다.
Dirty Read는
데이터의 일관성을 훼손할 수 있으므로
주의해야 한다.
Dirty Read 방지
한 트랜잭션이
다른 트랜잭션이 커밋한
변경 내용만 읽을 수 있다.
다른 트랜잭션이 변경한 데이터를 읽는 동안,
해당 데이터에 대한
다른 트랜잭션의 수정 작업이 완료되면
수정된 내용을 읽을 수 있다.
Non Repetable Read 방지
한 트랜잭션이 시작된 후에 조회된 데이터는
그 트랜잭션이 종료될 때까지
동일한 값을 유지한다.
같은 쿼리를 여러 번 실행해도
결과가 일관되게 유지된다.
다른 트랜잭션이
수정 작업을 진행하면서
새로운 데이터를 삽입할 경우,
해당 트랜잭션 내에서는
이전에 쿼리한 데이터와
다른 결과를 얻을 수 있다.
이것을 Phantom Read라고 한다.
Phanthom Read 방지
가장 엄격한 격리 수준으로,
한 트랜잭션이
다른 트랜잭션의
수정 작업이 진행 중인 데이터를
읽을 수 없다.
따라서
트랜잭션 내에서 실행한 쿼리의 결과는
항상 동일하게 유지된다.
동시성 제어를 위해
직렬화(Serialization)라는 방식을 사용한다.
트랜잭션 동작 도중 다른 트랜잭션을 호출하는 상황
트랜잭션을 시작하거나
기존 트랜잭션에 참여하는 방법에 대해 결정하는 속성 값
메서드(또는 클래스)가 실행될 때
현재 실행 중인 트랜잭션이 이미 존재하는 경우
해당 트랜잭션에 참여한다.
메서드가 실행될 때
이미 트랜잭션이 시작된 경우에는
그 트랜잭션 내에서 실행된다.
그렇지 않은 경우에는
새로운 트랜잭션이 시작된다.
메서드(또는 클래스)가 실행될 때
현재 실행 중인 트랜잭션이 이미 존재하는 경우
해당 트랜잭션에 참여한다.
항상 새로운 트랜잭션을 시작한다.
메서드(또는 클래스)가 실행될 때
이미 트랜잭션이 시작된 경우에도
현재 트랜잭션을 일시 중단하고
새로운 트랜잭션을 시작한다.
현재 실행 중인 트랜잭션이 존재하는 경우,
해당 트랜잭션 내에서 중첩된 트랜잭션을 시작한다.
중첩된 트랜잭션은 독립적인 저장점을 가지며,
롤백되거나 커밋될 수 있다.
중첩된 트랜잭션은 외부 트랜잭션에 영향을 받지만,
독립적인 커밋 또는 롤백이 가능하다.
트랜잭션을 읽기 전용 속성으로 지정
예외 발생 시 트랜잭션 롤백 시킬 경우 설정
설정을 안하면 기본적으로 RuntimeException , Error 발생 시 롤백 ㄱㄱ
일정 시간 내에 트랜잭션 끝내지 못하면 롤백