트랜젝션

dalBeen·2023년 9월 27일
0

스프링

목록 보기
2/14

트랜젝션

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

예를 들어 트랜젝션 : 오늘 날씨와 일기를 작성할때

  • 오늘 날씨 데이터 가져오기
  • 일기를 DB에 저장하기

작업단위 : select와 insert를 합친것


트랜젝션 특징

1. 원자성

트랜젝션이 데이터베이스에 모두 반영되던가, 아예 반영되지 않던가

2. 일관성

트랜젝션이 진행되는 동안에 데이터베이스가 변경되더라도 업데이트된 데이터베이스로 트랜젝션이 진행되는것이 아니라 처음에 트랜젝션을 진행하기 위해 참조한 데이터 베이스로 진행된다

3. 독립성

둘 이상의 트랜젝션이 동시에 실행되고 있을경우 어떤 하나의 트랜젝션이라도, 다른 트랜젝션의 연산에 끼어들 수 없다는 점
하나의 특정 트랜젝션이 완료될때까지, 다른 트랜젝션이 특정 트랜젝션의 결과를 참조할 숭 벗다

4. 지속성

트랜젝션이 성공적으로 완료되었을때 결과는 영구적으로 반영되어야한다는점


트랜젝션의 commit과 rollback

commit은 한 개의 논리적 단위(트랜잭션)에 대한 작업이 성공적으로 끝났고 데이터베이스가 다시 일관된 상태에 있을 때, 이 트랜잭션이 행한 갱신 연산이 완료된 것을 트랜잭션 관리자에게 알려주는 연산이다.

Rollback 연산은 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 이 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소(Undo)하는 연산


다수의 트랜잭션이 경쟁시 발생할 수 이쓴 문제

  1. Dirty Read
  • 아직 트랜젝션이 완료되지 않은 상황에서 데이터 접근을 허용할 경우 발생할 수 있는 데이터 불일치

    • 트랜젝션 A : D테이블 3번째 row 수정중
    • 트랜젝션 B : D테이블 3번째 row 조회하려함

  1. Non-Repeatable Read
  • 한 트랜젝션이 같은 쿼리를 두번 실행했을때 발생할 수 있는 데이터 불일치

    • 트랜젝션 A : D테이블 0~4번째 row조회 2번
    • 트랜젝션 B : D테이블 3번째 row 수정후 커밋

  1. Phantom Read
  • 한 트랜젝션에서 일정 범위의 레코드를 두번 이상 읽을때 발생하는 데이터 불일치

    • 트랜젝션 A : D테이블 0~4번째 row조회 2번
    • 트랜젝션 B : D테이블 3번째 row 수정후 커밋


스프링 트랜젝션

클래스나 메서드 위에 어노테이션을 추가할 수 있음
트랜젝션 기능이 적용된 프록시 객체 생성

Isolation격리수준

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

  • DEFAULT

  • READ_UNCOMMITTED (Dirty Read 발생)

  • READ_COMMITTED (Dirty Read 방지)

  • REPEATABLE_READ (Non-Repeatable Read 방지)

  • SERIALIZABLE (Phantom Read 방지)


Propagation 전파수준

트랜젝션 동작 도중 다른 트랜젝션을 호출하는상황에서 선택할 수 있는 옵션
트랜제션을 시작하거나 기존 트랜젝션에 참여하는 방법에 대해 결정하는 속성값

  • REQUIRED: 디폴트 속성으로 부모 트랜잭션 내에서 실행하며, 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성
  • SUPPORTS: 이미 시작된 트랜잭션이 있으면 참여하고 그렇지 않으면 트랜잭션 없이 진행
  • REQUIRED_NEW: 부모 트랜잭션을 무시하고 무조건 새로운 트랜잭션을 생성
  • MANDATORY: REQUIRED와 유사하게 이미 시작된 트랜잭션이 있으면 참여하지만, 시작된 트랜잭션이 없으면 예외를 발생
  • REQUIRES_NEW: 항상 새로운 트랜잭션을 시작. 이미 진행 중인 트랜잭션이 있으면 트랜잭션을 잠시 보류
  • NOT_SUPPORTED: 트랜잭션을 사용하지 않음. 이미 진행중인 트랜잭션이 있으면 보류
  • NEVER: 트랜잭션을 사용하지 않도록 강제함. 이미 진행중인 트랜잭션이 있으면 예외를 발생
  • NESTED: 이미 진행중인 트랜잭션이 있으면 중첩 트랜잭션을 시작. 중첩된 트랜잭션은 부모의 커밋과 롤백에는 영항을 받지만, 자신의 커밋과 롤백은 부모에게 영향을 주지 않음

ReadOnly

트랜젝션 읽기 전용으로 설정할 수 있음. 성능 최적화를 위해 특정 트랜젝션 작업안에서 쓰기 작업이 일어나는 것을 의도적으로 방지하기 위해 사용


트랜젝션 롤백 예외

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

@Transactional(rollbackFor=Exception.class) 
@Transactional(noRollbackFor=Exception.class) 

TimeOUT

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

@Transactional(timeout=10)

@EnableTransactionManagement을 Application에 추가해서 트랜젝션 반영하기

profile
깊게 공부해보자

0개의 댓글