[Spring Boot] 트랜잭션(Transaction)이란?

2024. 8. 23. 23:04프로그래밍/Spring Boot

트랜잭션(Transaction)이란?

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

요약하자면 그냥 작업 단위로 이해하면 된다.

 

 

트랜잭션의 4가지 속성

1. 원자성(Atomicity)

2. 일관성(Consistency)

3. 독립성(Isolation)

4. 지속성(Durability)

 

위와 같은 트랜잭션의 속성들이 지켜져야 서비스 관리가 원활하게 가능하다.

 

만약 트랜잭션끼리의 문제가 생긴다면?

문제상황1. Dirty Read

ex. 트랜잭션A는 테이블의 3번째 row 수정중 vs 트랜잭션B는 테이블의 3번째 row 조회하려고 함

 

문제상황2. Non-Repeatable Read

ex. 트랜잭션A가 테이블을 처음 조회 vs 트랜잭션B가 수정 후 커밋 vs 다시 조회했을 때 내용 다름

 

문제상황3. Phantom Read

ex. 일정 범위의 데이터를 여러번 읽을 때, 첫번째 쿼리에서는 없던 유령(phantom) 데이터가 두번째에서는 나타나는 현상

 

 

 

 

@Transactional

그러한 문제들을 해결하기 위하여 Spring에서 Transaction에 대하여 여러 세부적인 설정들을 할 수 있음

 

스프링 부트에서의 @Transactional 어노테이션을 통하여 다양한 옵션들을 설정할 수 있다.

 

 

1. Isolation(격리 수준)

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

- DEFAULT: 데이터베이스의 기본적인 격리수준을 사용

- READ_UNCOMMITTED: dirty read가 발생해도 허용하는 정도

- READ_COMMITTED: dirty read는 허용하지 않음

- REPEATABLE_READ: non-repeatable read 만큼은 방지

- SERIALIZABLE: phantom read를 방지

@Transactional(isolation = Isolation.DEFAULT)
public void save(MemberRequestDto request){
	MemberEntity savedMember = MemberMapper.toEntity(request);
	memberRepository.save(request);
}

 

 

2. Propagation(전파수준)

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

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

- REQUIRED

- SUPPORTS

- REQUIRES_NEW

- NESTED

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

로그 저장이 실패한다면 -> 일기 작성까지 롤백되면 안 됨

일기 저장이 실패한다면 -> 로그 작성까지 롤백되어야함

 

 

3. readOnly 속성

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

@Transactional(readOnly = true)

@Transactional(readOnly = false) -> 주로 수정이 필요한 트랜잭션에 대하여 false 값 설정

 

주로 GET 메소드에 매핑되는 메소드들에 적용한다

@Transactional(readOnly = true)
public String getLoginUrl() {
	return String.format(
               "%s/oauth/authorize?client_id=%s&redirect_uri=%s&response_type=code&prompt=login",
               KAUTH_TOKEN_URL_HOST, clientId, redirectUri);
}

 

 

 

4. 트랜잭션 롤백 예외

예외가 발생했을 때 트랜잭션 롤백 시킬 경우에 대하여 설정(어떤 예외는 롤백 시키고 어떤 예외는 롤백 시키지 않음)

@Transactional(rollbackFor = Exception.class)

@Transactional(noRollbackFor = Exception.class)

Default : RuntimeException, Error

 

트랜잭션의 연산 -> 커밋(Commit) / 롤백(Rollback)

커밋은 트랜잭션의 결과를 반영하는 것이고, 롤백은 데이터베이스의 상태를 트랜잭션 시행 전으로 되돌리는 것이다.

 

 

5. Timeout 속성

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

ex. @Transactional(timeout=10) 10초안에 끝내지 못하면 롤백

 

 

이러한 유용한 설정들이 존재하기 때문에 service 코드에 메소드 별로 transaction을 어노테이션으로 추가해두는 것이다!

기억해두었다가 제대로 설정하자.