Transaction

어겐어갠·2022년 4월 14일
0

트랜잭션의 성질

  • 원자성(Atomicity)
    : 한 트랜잭션의 결과는 성공 혹은 실패뿐
  • 일관성(Consistency)
    : 일관성있는 데이터베이스 상태를 유지
  • 격리성(Isolation)
    : 트랜잭션 간 독립적이어야한다
  • 지속성(Durability)
    : 트랜잭션을 마치면 저장되어야한다.

트랜잭션 추상화

Springd은 트랜잭션 추상화를 제공한다. 이를 통해 Jdbc나 Hibernate에 종속되지 않고 트랜잭션 처리가 가능해진다.

AOP 트랜잭션

스프링은 관점 지향 프로그래밍을 통해 트랜잭션을 위한 코드를 별도로 분리하였고 이를 어노테이션화하여 @Transactional을 통해 쉽게 적용할 수 있다.

트랜잭션 전파옵션(Propagation)

A가 진행중인 작업이며 B가 새로운 작업일 경우

  • Required
    : 보통 디폴트이며 A가 트랜잭션일 경우 A+B(같은 트랜잭션에 묶임)
    A, B는 같은 트랜잭션이며 운명을 함께한다.
  • Required_New
    : B는 항상 새로운 트랜잭션을 만듬.
    A, B는 별개의 트랜잭션이고 서로 영향을 안준다.
  • Mandatory
    : 트랜잭션이 필요하다. 기존 트랜잭션이 있을경우 참여(Required)하지만, 없을경우 예외가 반환된다.
  • Supportes
    : 트랜잭션이 있으면 묶이고, 없으면 트랜잭션 없이 작업함
  • Not_Supported
    : 트랜잭을 사용하지 않으며, 있을경우 A의 트랜잭션을 잠시 멈추고 작업을 진행, B의 작업이 끝난 후 멈추었던 트랜잭션을 다시 진행시킨다.
  • Never
    : 트랜잭션을 사용하지 않는다. 만일 A가 트랜잭션 동작중일 경우 예외를 반환.
  • Nested
    : 진행중인 트랜잭션이 있으면 중첩 트랜잭션을 시작한다.
    (중첩된 트랜잭션 -> 부모(A)/자식(B) 관계로 보면 부모 트랜잭션의 커밋 롤백은 자식에게 영향을 주지만 그 반대는 성립되지 않음.

다수 트랜잭션 경쟁시 발생 문제 3단계 (A, B는 모두 트랜잭션)

  1. Dirty Read
    A가 값을 before -> new 변경 / not commit 상태일 때
    B가 조회할 경우 new가 읽히는 것
    발생되는 문제 -> not commit 이므로 rollback하면 값은 before이 되지만 B가 읽은 값은 new
  1. Non-Repeatabe Read
    A가 조회한 값 = before / B가 before -> new 값 변경 / A가 한 트랜잭션 안에서 다시 같은 값을 조회했을 때 나오는 값 = new
    한 트랜잭션에서 같은 쿼리문을 조회했는데 결과가 다르다.
  1. Phantom Read
    A가 레코드 조회했을때 값 =[1, 2, 3] / 이후 B가 값에 [4, 5, 6]을 추가한다면 같은 쿼리를 조회했을 때 또 값이 달라짐.

위의 상황을 방지하는 속성 - Isolation(격리 수준)

  1. Default
    : 사용하는 DB의 기본 전략을 따름

  2. Read_Uncommitted(level 0)
    : 트랜잭셔 처리중인 데이터에 대한 읽기 허용
    -> Dirty Read 발생

  3. Read_Committed(level 1)
    : 커밋 된 데이터만 읽기 허용(데이터가 트랜잭션 중에는 접근 불가)
    -> Dirty Read 방지

  4. Repeatable_Read(leve 2)
    : 트랜잭션 완료 전까지 데이터 갱신, 변경 불가능
    -> Non-Repeatable_Read 방지

  5. Serializable(leve 3)
    : 트랜잭션 완료 전까지 새로운 레코드 삽입 방지
    -> Phantom Read 방지

https://goddaehee.tistory.com/167
http://wiki.gurubee.net/pages/viewpage.action?pageId=21200923

profile
음그래

0개의 댓글