ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ibatis] Transaction txAdvice 옵션
    Developer/Spring 2012. 11. 2. 16:27

    1 transaction (트랜젝션)
    2 (1) ACID : 트랜젝션에서 추구했던 기본 4요소 (다 수행되던가 없던일 하던가)
    3 2) Consistency : 일관성 DB가 트랜젝션 작업중 일관된 데이터를 유지해야 한다
    4 3) Isolation : 독립성 다른 트랜젝션과 독립적으로 작업이 수행되어야 한다.
    5 4) Durability : 내구성 일단 커밋된 데이터는 계속해서 유지되어야 한다. 시스템 오류라 할지라도...
    6 (2) 프로그램적인 트랜젝션
    7 1) TransactionTemplate을 사용하거나 PlatformTransactionManager를 직접 상속받아서 쓰는 방법이 있다.
    8 2) RuntimeException 이 던져지면 rollback 이 된다. (그 외의 exception 은 기본적으로 무시)
    9 (3) 선언적인 트랜젝션
    10 1) Propagation (트랜젝션의 전파)
    11 <1> PROPAGATION_REQUIRED : 이미 있는 트랜젝션이 있다면 그걸 쓰고, 없다면 새로 만들어 낸다.
    12 <2> PROPAGATION_MANDATORY : 이미 있는 트랜젝션이 있다면 그걸 쓰고, 없다면
    13 TransactionRequiredException 을 발생시킨다.
    14 <3> PROPAGATION_REQUIRES_NEW : 이미 있는 트랜젝션을 잠시 멈추고
    15 새로운 트랜젝션을 만들어서 수행한다. 새로운 트랜젝션 종료후 기존 트랜젝션이 계속 실행된다.
    16 <4> PROPAGATION_NESTED : 트랜젝션은 하나만 쓰지만 중간에 savepoint 를 저장하는 방식을 말한다.
    17 (JDBC 매니져 방식에서만 적용 가능 Hibernate 나 JDO 같은 ORM 에서는 사용불가)
    18 <5> PROPAGATION_SUPPORTS : 트랜젝션이 없어도 되지만 트랜젝션이 실행되는 중에는 적용을 받는다
    19 ex) 일일 이체 한도액이 100만원이라고 한다면
    20 1. 50만원을 이체하는 트랜젝션이 시작
    21 2. 70만원을 이체하는 SUPPORTS 트랜젝션 시작
    22 3. 이체한도를 넘기는 결과가 되어 2번의 과정은 롤백이 된다.
    23 4. 50만원만 이체가 된다.
    24 <6> PROPAGATION_NOT_SUPPORTED : 트랜젝션이 필요없기 때문에 기존 트랜젝션이 있을 경우
    25 기존 트랜젝션을 멈추었다가 메소드 실행이 끝난 뒤 트랜젝션을 다시 시작한다.
    26 <7> PROPAGATION_NEVER : 이미 트랜젝션이 있다면 익셉션을 던져서 메소드 실행을 중지한다.
    27 2) Isolation (독립성) : 문서 참고
    28 독립성이 증가하면 동시성은 감소하고, 데이터의 일관성은 증가한다.
    29 <1> READ_UNCOMMITTED : 트랜젝션 중 다른 트랜젝션에 의한 커밋되지 않은 데이터도 읽어들일 수 있다.
    30 <2> READ_COMMITTED : 커밋된 데이터만 읽을 수 있다.
    31 (다른 트랜젝션에 의한 커밋으로 일어난 변화는 읽어들인다)
    32 <3> REPEATABLE_READ : 트랜젝션 진행중에는 어떠한 변화점도 읽어들일 수 없다.
    33 (다른 트랜젝션에 의한 커밋도 상관없이 못 읽어들인다)
    34 <4> SERIALIZABLE : DB에 하나의 트랜젝션만 허용하는 것으로 하나의 트랜젝션이 실행중에
    35 다른 트랜젝션이 접근한다면 잠시 중지했다가 기존 트랜젝션이 끝나고 나면 다시 시작한다.
    36 단, 오라클은 트랜젝션이 중지했다가 시작되는 것이 아니라 ORA-08177 오류를 발생시킨다.
    37 <5> DEFAULT : DB가 사용하는 isolation 정책 따름
    38 ※ 문제점 정리
    39 - Dirty read: 어떤 트랜잭션 T1이 다른 트랜잭션 T2가 아직 커밋하지 않은 데이타를 읽었는데
    40 T2가 롤백 되는 경우. T1이 읽은 데이타는 dirty.
    41 - Nonrepeatable read: 어떤 트랜잭션 T1이 계속 해서 같은 데이터를 읽어들이는데 그 사이에
    42 다른 트랜잭션 T2가 데이타를 수정하면 T1은 같은 데이터를 얻을 수 없게 된다.
    43 - Phantom read: 어떤 트랜잭션 T1이 계속 데이터를 읽어들이는데 그 사이 다른 트랜잭션 T2가
    44 새로운 데이타를 추가하면 T1은 전혀 새로운 데이터를 읽어들이게 된다. 마치 귀신처럼.

     

     

     

    'Developer > Spring' 카테고리의 다른 글

    [Spring] 의존성 주입 방법  (0) 2018.08.10
    [Spring] DI 개념  (0) 2013.03.13
    [Spring] 주요 모듈 구성  (0) 2013.02.28
    [Spring] AOP  (0) 2013.02.28
© 2018 T-Story. All right reserved.