본문 바로가기
Backend/공부 일지

2024/03/01(금)

by 박상윤 2024. 3. 2.

Part. Spring

트랜잭션(Transaction)

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

 

- 원자성(Atomicity) : 트랜잭션이 DB에 모두 반영이 되거나 모두 반영이 되지 않아야 한다.

- 일관성(Consistency) : 트랜잭션에 작업처리 결과는 항상 일관적이여야 한다.

- 독립성(Isolation) : 독립적으로 하나의 트랜잭션이 수행이되고, 그 다음 트랜잭션이 수행이 되어야 한다.

- 지속성(Durability) : 트랜잭션이 성공적으로 완료가 되었다면, 변화된 상태가 쭉 지속이 되어야 한다. (영구적으로 반영이 되어야 한다.)

 

주로 DB에 문제가 생겼을 때 롤백 시키기 위해 사용햔다.

 

트랜잭션의 연산

- 커밋(Commit) : 트랜잭션 전체가 잘 실행되었을때, 마무리 하기

- 롤백(Rollback) : 트랜잭션 전체를 하다가 예외가 발생했을때, 트랜잭션 전체를 Rollback

 

여러 트랜잭션이 경쟁하면 생기는 문제

 

1. Dirty Read

트랜잭션 A : 테이블에 3번째 row 수정중

트랜잭션 B : 테이블의 3번째 row 조회

 

2. Non-Repeatable Read (일관성 속성을 만족시키지 못한다.) - 특정의 값

트랜잭션 A : 테이블의 3번째 row 조회 2번

트랜잭션 B : 테이블의 3번째 row 수정 후 커밋

트랜잭션 A가 1번 실행, 트랜잭션 B가 실행, 트랜잭션 A가 실행

 

3. Phantom Read (일관성 속성을 만족시키지 못한다.) - 특정 범위

트랜잭션 A : 테이블의 0~4번째 row 조회 2번

트랜잭션 B : 테이블의 3번째 row 수정 후 커밋

 

@Transactional

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

트랜잭션 기능이 적용된 프록시 객체 생성

(Platform Transaction Manager)

 

Spring 트랜잭션의 세부 설정들

(1) Isolation(격리수준)

(2) Propagation(전파수준)

(3) ReadOnly 속성

(4) 트랜잭션 롤백 예외

(5) timeout 속성

 

(1) Isolation(격리 수준)

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

- DEFAULT
- READ_UNCOMMITTED (Dirty Read 발생)

- READ_COMMITTED (Dirty Read 방지)

- REPEATABLE_READ (Non-Repeatable Read 방지, Dirty Read 방지)

- SERIALIZABLE (Phantom Read 방지)

@Transactional(isolation=Isolation.DEFAULT)

 

(2) Propagation(전파 수준)

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

 

트랜잭션을 시작하거나

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

 

- REQUIRED : 부모 트랜잭션 안에서 자식 트랜잭션까지 함께 실행을 한다.
- SUPPORTS : 이미 시작된 트랜잭션이 있으면 참여하고, 없으면 트랙잭션이 없이 진행을 한다. 
- REQUIRES_NEW : 부모 트랜잭션 안에서 함수 B가 동작을 하게 될 경우에 부모 트랜잭션이 있어도 자식 트랜잭션을 새로 생성해서 진행한다.
- NESTED : 이미 진행중인 트랜잭션이 있는 경우에, 중첩 트랜잭션을 시작한다. 

 

NESTED 사용 예시

ex) 일기 작성 관련해서 로그를 DB에 저장하는 상황

(1) 로그 저장이 실패한다고 해서 일기 작성까지 롤백되면 안됨

(2) 일기 작성이 실패한다면 로그 작성까지 롤백 되어야 함

 

(3) readOnly 속성

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

@Transactional(readOnly = true)

 

(4) 트랜잭션 롤백 예외

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

@Transactional(rollbackFor=Exception.class)

@Transactional(noRollbackFor=Exception.class) - 예외가 발생해도 롤백을 시키고 싶지 않은 경우

Default: RuntimeException, Error

 

(5) Timeout 속성

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

@Transactional(timeout = 10)

 

기억해야할 것 : 격리 수준과 격리 수준을 가지고 여러개의 트랜잭션이 하나의 레포를 가지고 경쟁을 할때, 어떻게 해결할 수 있는지

 

트랜잭션 코드에 반영하기

@Transactional

@EnableTranscationManagement : 이부분을 작성해주어야 프로젝트 내에서 Transaction들이 정상적으로 동작한다.

제일 상위 클래스에다가 붙여주면 된다.

 

메소드 외에 클래스에도 @Transactional 어노테이션을 달아줄 수 있다.

@Transactional
Class {
	Method {}
    	Method {}
}

 

클래스에 붙어있는 ReadOnly가 true이고, 클래스 내부의 메소드가 ReadOnly가 false인경우, ReadOnly false가 적용된다.

 

'Backend > 공부 일지' 카테고리의 다른 글

2024/03/05(화) 가자! 네카라쿠배당토  (0) 2024.03.05
2024/03/04(월)  (0) 2024.03.05
2024/03/03(일)  (0) 2024.03.04
2024/03/03(일)  (0) 2024.03.03
2024/02/29(목)  (1) 2024.03.01