데이터베이스 트랜잭션(Transaction)

Timo·2022년 8월 12일
0
post-thumbnail

트랜잭션(Transaction)이란

여러 개의 질의(절차)를 논리적인 하나의 단위로 묶는 것

트랜잭션의 특징(ACID)

  • 원자성(Atomicity)
    • 트랜잭션이 DB에 전부 반영되거나 하나도 반영되지 않아야 한다.
  • 일관성(Consistency)
    • 트랜잭션의 작업 처리 결과는 항상 일관성이 있어야 한다.
  • 격리성(Isolation)
    • 둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 때, 어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다.
  • 지속성(Durability)
    • 트랜잭션이 성공적으로 완료되었으면, 결과는 영구적으로 반영되어야 한다.

트랜잭션의 격리 수준(Isolation Level)

READ UNCOMMITTED

어떤 트랜잭션에서 변경한 데이터를 커밋되기 전이어도 다른 트랜잭션에서 읽을 수 있다.

처음 실행된 트랜잭션에서 진행 중 문제가 발생해 롤백되어도, 다른 트랜잭션에서는 이미 데이터를 읽은 상황이라면 정확하지 않은 데이터를 읽은 것이므로 정합성에 문제가 생긴다.

READ COMMITTED

하나의 트랜잭션에서 데이터를 변경하더라도 다른 트랜잭션은 커밋된 상태의 데이터만 읽을 수 있다.

A 트랜잭션이 데이터를 변경하고 있는 상황에서 B 트랜잭션이 접근하면 커밋된 데이터만 읽을 수 있기 때문에 변경 전 데이터를 읽을 것이다. B 트랜잭션이 끝나지 않은 상황에서 A 트랜잭션이 변경된 데이터를 커밋하면, 이제 B 트랜잭션은 동일한 트랜잭션 상황에서 달라진 데이터를 확인하게 된다. 이를 Non-Repeatable 현상이라고 한다.

REPEATABLE READ

하나의 트랜잭션이 데이터를 읽는 중이면 다른 트랜잭션은 해당 데이터를 변경할 수 없다.

Non-Repeatable 현상을 개선하기 위해 보완된 격리 수준으로
이를 통해 하나의 데이터를 읽을 때 트랜잭션의 시작과 끝까지 그 데이터가 같은 값을 가짐을 보장할 수 있다.

SERIALIZABLE

하나의 트랜잭션에 데이터에 접근했다면 다른 트랜잭션은 접근할 수 없다.

스프링에서 트랜잭션을 다루는 방법

@Transactional 어노테이션을 사용한다.
AOP에 의해서 프록시를 통해 템플릿 콜백패턴으로 처리된다.
메서드 레벨에 어노테이션을 붙일 경우 해당 메소드의 로직 실행 전에 트랜잭션을 시작한다. 메서드를 수행하고, 정상적으로 수행되었다면 트랜잭션 매니저를 통해 커밋을 한다. 메서드 실행이 실패(예외 발생)할 경우 롤백한다.

참고자료

트랜잭션의 격리 수준(isolation Level)이란?
https://youtu.be/e9PC0sroCzc
YouTube
YouTube
DB 트랜잭션(Transaction) | 👨🏻‍💻 Tech Interview

profile
나는 매일 성장하는 사람

0개의 댓글