cs 기술 면접 공부

Spring Transaction

DaEun_ 2023. 5. 11. 09:21

DB의 격리 수준

 

1. Read Uncommited

  1. commit 이나 rollback 여부 상관 없이 다른 트랜잭션에서 값을 읽을 수 있다.
  2. 정합성 문제가 많은 격리 수준이기 때문에 사용하지 않는 것을 권장한다.
  3. commit되지 않은 상태지만, update된 값을 다른 트랜잭션에서 읽을 수 있다.
  4. Dirty Read 발생 트랜잭션 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있는 현상

 

2. Read Commited

  1. Dirty Read 발생 x
  2. 실제 테이블에서 가져 오는 것이 아니라, undo 영역에 백업 된 레코드에서 값을 가져온다.
  3. T1이 commit한 이후 아직 끝나지 않은 T2가 다시 테이블 값을 읽으면 값이 변경 됨을 알 수 있다.⇒ 입, 출금의 금전적인 처리에서 주로 발생
  4. ⇒ Reapeatable Read 정합성에 어긋남: 하나의 트랜잭션 내에서 똑같은 select 쿼리 실행 시 항상 같은 결과를 가져오지 않는다.

 

3. Repeatable Read

  1. MySQL에서는 트랜잭션 마다 ID를 부여하여 트랜잭션 ID보다 작은 트랜잭션 번호에서 변경한 것만 읽게 된다.
  2. Undo 공간에 백업해두고 실제 레코드 값을 변경한다.
    • 백업 된 데이터는 불필요하다고 판단하는 시점에 주기적으로 삭제한다.
    • Undo에 백업 된 레코드가 많아지면 MySQL 서버의 처리 성능이 떨어질 수 있다.
  3. Phantom Read 발생: 다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다가 안 보였다가 하는 현상 (이를 위해 쓰기 잠금 필요)

4. Serializable

  1. Phantom Read 발생 x

 

Transaction ACID

 

 

Spring Transaction

  1. 개발자가 직접 transaction 관련 코드 작성
  2. : 개발자가 상세하게 다양한 상황을 고려한 tx 관리 기능
  3. 선택적 방법 tx 관리(AOP로 처리): xml, Anotation

 

TX 문제 상황

  1. Dirty Read
  2. Unrepeatable Read
  3. phantom Read

 

@Transactional

  • DB와 관련된, 트랜잭션이 필요한 서비스 클래스 혹은 메소드에 어노테이션을 달아준다.
  • 일련의 작업들을 묶어서 하나의 단위로 처리하고 싶다면, 면 @Transactional을 활용하자.
  • 작업 중에 하나라도 실패할 경우 전체 작업을 취소한다.
  • ⇒ 게시글 삭제 메소드

 

@Transactional(readOnly = true)

  • 트랜잭션을 읽기 전용으로 설정
  • 성능 최적화위해 사용하거나, 특정 트랜잭션 작업 안에서 쓰기 작업이 일어나는 것을 의도적으로 방지하기 위해 사용

단, AutoIncrement 는 트랜잭션 범위 밖에서동작하기 때문에 rollback되어도 다시 감소하지 않는다.

 

 

참고: https://velog.io/@betterfuture4/Spring-Transactional-총정리

'cs 기술 면접 공부' 카테고리의 다른 글

Spring AOP  (0) 2023.05.11
AJAX  (0) 2023.03.20
데이터 저장소, JSON  (0) 2023.03.16
JavaScript (2)  (0) 2023.03.16
Java Script (1)  (0) 2023.03.16