[SPRING] 트랜잭션 (Transaction)

김승수·2024년 7월 4일
0

SPRING

목록 보기
24/27

⏰ 2024. 07. 03 수

✔ 스프링 이론 강의를 듣고 정리하면서 작성했습니다.

💡 목차

  1. 트랜잭션 정의
  2. 트랜잭션의 특징 ACID
  3. 트랜잭션의 격리수준(isolation level)
  4. 트랜잭션의 지속성(Durability)을 보장하기 위한 방법
  5. Spring에서 @Transactional 애노테이션을 사용할 때 주의할 점
  6. Spring에서 트랜잭션 프로세스

Transaction

트랜잭션 정의

  • 트랜잭션은 DBMS에서 작업이 수행되는 논리적 단위이다.
  • 여러 DB의 동작이 하나의 트랜잭션으로 묶여 관리되고, 하나의 트랜잭션의 모든 작업이 완료되어야 DB에 반영됩니다.
  • 만약 하나의 작업이라도 실패한 경우 모든 작업이 취소되기 때문에 데이터의 일관성과 무결성을 보장한다.

트랜잭션의 특징 ACID

  • 원자성('A'tomicity) : 트랜잭션 내의 모든 연산이 완료되면 그 결과가 DB에 반영되고, 하나라도 실패하면 모든 연산은 취소된다.
  • 일관성('C'onsistency) : 트랜잭션의 작업 처리 결과는 항상 일관적이어야 하고, 그 결과가 DB의 일관성을 유지해야 한다.
  • 독립성('I'solation) : 동시에 발생하는 트랜잭션은 서로 간섭하지 않고 독립적으로 실행되어야 한다.
  • 지속성('D'urability) : 트랜잭션의 수행이 완료되면 그 결과는 영구적으로 DB에 반영되어야한다.

트랜잭션의 격리수준(isolation level)

  • 트랜잭션 격리 수준은 트랜잭션 상태안에 있는 데이터의 조회할 수 있는 수준을 나태내는 단계이다. 종류로는 4 가지 Read Uncommitted, Read Committed, Repeatable Read, Serializable이 있다.

  • Read Uncommitted: 다른 트랜잭션이 커밋하지 않은 변경 사항도 읽을 수 있는 수준 (더티 리드 발생 가능)

  • Read Committed: 다른 트랜잭션이 커밋한 데이터만 읽을 수 있는 수준 (더티 리드 방지)

  • Repeatable Read: 트랜잭션 동안 읽은 데이터가 변경되지 않는 수준 (팬텀 리드 발생 가능)

  • Serializable: 가장 높은 격리 수준으로, 트랜잭션을 순차적으로 실행하여 모든 문제를 방지하는 수준

⚡더티 리드 문제

  • 커밋되지 않은 데이터를 읽는 문제

⚡팬텀 리드 문제

  • 트랜잭션 동안 새로운 데이터가 삽입되어 쿼리 결과에 영향을 미치는 문제

트랜잭션의 지속성(Durability)을 보장하기 위한 방법

  • 트랜잭션 로그와 데이터베이스 백업을 통해 지속성을 보장한다.
  • 트랜잭션 완료 후 로그를 디스크에 저장하고, 시스템 장애 발생 시 로그를 통해 복구한다.

Spring에서의 트랜잭션

Spring에서 @Transactional 애노테이션을 사용할 때 주의할 점

  • @Transactional 애노테이션은 public 메서드에만 적용해야 하며, 프록시를 통해 트랜잭션이 관리되기 때문에 메서드 내부에서 다른 트랜잭션 메서드를 호출하면 트랜잭션이 제대로 적용되지 않을 수 있다.

Spring에서 트랜잭션 프로세스

  1. Begin 메서드를 통해 트랜잭션이 시작된다.
  2. 트랜잭션 내에서 여러 DB SQL 작업이 수행된다.
  3. 트랜잭션 내에서 수행된 모든 작업은 임시로 저장된다.
  4. 모든 작업이 완료되었는지 검증한다.
  5. 검증을 통해 모든 작업이 완료되었다면, Commit하고 임시로 저장된 내용이 DB에 영구적으로 반영된다.
  6. 하나의 작업이라도 실패하거나 오류가 발생하면 트랜잭션 시작 전으로 Rollback한다.
profile
개발하는 미어캣

0개의 댓글