트랜잭션 transaction

김아무개·2023년 5월 22일
0

Spring Boot 🍃

목록 보기
17/95
post-custom-banner

데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위

CRUD 작업 모두 데이터베이스의 상태를 변화시키게 됨

트랜잭션을 이루는 4가지 속성

속성에 대한 이해 필요

원자성 Atomicity

트랜잭션의 작업 처리 결과가
모두 DB에 반영 되거나,
모두 DB에 반영 되지 않아야 함.

일관성 Consistency

트랜잭션의 작업 처리 결과는
항상 일관적이어야 한다.

독립성 Isolation

여러개의 트랜잭션들이 하나의 DB에서 작업할 때
서로에게 영향을 미쳐선 안된다.

지속성 Durability

트랜잭션이 성공적으로 완료되어 DB에 변화가 생겼다면,
그 변화는 영구적이어야 한다.


트랜잭션 수행 후 실행될 수 있는 연산 2가지

커밋 Commit

트랜잭션이 성공적으로 작업을 완료했다고 판단하면
지금까지의 작업을 반영하겠다는 뜻으로 커밋을 수행 함

롤백 Rollback

트랜잭션 과정 중 예외 상황이나 오류 같은 문제 상황이 발생했을 때
지금까지의 작업을 모두 작업 시작 전으로 되돌리겠다는 뜻으로 롤백을 수행 함


트랜잭션이 경쟁한다면??

오호
경쟁을 한다

해당 부분에 대해 자세히 알아보기

Dirty Read 문제 발생

Non Repeatable Read 문제 발생

Rhantom Read 문제 발생

Non Repeatable과 Phantom Read의 차이점도 알아보기

Spring에서 transaction 적용하기

클래스, 메서드 위에 @Transactional 어노테이션을 추가할 수 있다.

+ 트랜잭션 사용 시
   main() 메서드 품은 클래스에
   @EnableTransactionManagement 추가해주어야 됨

Spring 트랜잭션의 세부 설정들

Isolation 격리 수준

트랜잭션에서 일관성이 없는 데이터를 허용하는 수준

사용 예시

@Transactional(isolation = Isolation.대문자_옵션)

Default

READ_UNCOMMITTED

Dirty Read 발생

한 트랜잭션이
아직 커밋되지 않은 다른 트랜잭션의
변경 내용을 읽을 수 있다.

이 말은
다른 트랜잭션이
아직 롤백되거나 커밋되지 않았음에도 불구하고
변경된 데이터를 읽을 수 있다는 얘기이다.

Dirty Read는
데이터의 일관성을 훼손할 수 있으므로
주의해야 한다.

READ_COMMITTED

Dirty Read 방지

한 트랜잭션이
다른 트랜잭션이 커밋한
변경 내용만 읽을 수 있다.

다른 트랜잭션이 변경한 데이터를 읽는 동안,
해당 데이터에 대한
다른 트랜잭션의 수정 작업이 완료되면
수정된 내용을 읽을 수 있다.

REPEATABLE_READ

Non Repetable Read 방지

한 트랜잭션이 시작된 후에 조회된 데이터는
그 트랜잭션이 종료될 때까지
동일한 값을 유지한다.

같은 쿼리를 여러 번 실행해도
결과가 일관되게 유지된다.

다른 트랜잭션이
수정 작업을 진행하면서
새로운 데이터를 삽입할 경우,
해당 트랜잭션 내에서는
이전에 쿼리한 데이터와
다른 결과를 얻을 수 있다.

이것을 Phantom Read라고 한다.

SERIALIZABLE

Phanthom Read 방지

가장 엄격한 격리 수준으로,
한 트랜잭션이
다른 트랜잭션의
수정 작업이 진행 중인 데이터를
읽을 수 없다.

따라서
트랜잭션 내에서 실행한 쿼리의 결과는
항상 동일하게 유지된다.

동시성 제어를 위해
직렬화(Serialization)라는 방식을 사용한다.

Propagation 전파 수준

트랜잭션 동작 도중 다른 트랜잭션을 호출하는 상황

트랜잭션을 시작하거나
기존 트랜잭션에 참여하는 방법에 대해 결정하는 속성 값

REQUIRED (DEFAULT)

메서드(또는 클래스)가 실행될 때
현재 실행 중인 트랜잭션이 이미 존재하는 경우
해당 트랜잭션에 참여한다.

메서드가 실행될 때
이미 트랜잭션이 시작된 경우에는
그 트랜잭션 내에서 실행된다.

그렇지 않은 경우에는
새로운 트랜잭션이 시작된다.

SUPPORTS

메서드(또는 클래스)가 실행될 때
현재 실행 중인 트랜잭션이 이미 존재하는 경우
해당 트랜잭션에 참여한다.

REQUIRES_NEW

항상 새로운 트랜잭션을 시작한다.

메서드(또는 클래스)가 실행될 때
이미 트랜잭션이 시작된 경우에도
현재 트랜잭션을 일시 중단하고
새로운 트랜잭션을 시작한다.

NESTED

현재 실행 중인 트랜잭션이 존재하는 경우,
해당 트랜잭션 내에서 중첩된 트랜잭션을 시작한다.

중첩된 트랜잭션은 독립적인 저장점을 가지며,
롤백되거나 커밋될 수 있다.

중첩된 트랜잭션은 외부 트랜잭션에 영향을 받지만,
독립적인 커밋 또는 롤백이 가능하다.


ReadOnly 속성

트랜잭션을 읽기 전용 속성으로 지정

true

false (default)


트랜잭션 롤백 예외

예외 발생 시 트랜잭션 롤백 시킬 경우 설정

설정을 안하면 기본적으로 RuntimeException , Error 발생 시 롤백 ㄱㄱ

rollbackFor = 예외클래스.class

noRollbackFor = 예외클래스.class


timeout 속성

일정 시간 내에 트랜잭션 끝내지 못하면 롤백

profile
Hello velog! 
post-custom-banner

0개의 댓글