2013년 9월 4일 수요일

Spring transaction 에 대해

Spring transaction 에 대해

Transaction

이야기를 시작하기 전에 먼저 Transaction이란 무엇인지 간단하게 알아보자.
Transaction은 ACID라는 약어로 표현될 수 있고 각각의 정의는 아래와 같다.
  • Atomicity(원자성)
    • 복수의 SQL 문을 모아서 하나의 단위로 처리할 수 있다. 모두 커밋 되거나 모두 롤백 된다.
  • Consistency(일관성)
    • 여러 테이블에 걸쳐 있는 갱신 등은 도중에 오류가 발생하더라도 다른 한쪽만이 갱신되어 버리는 모순된 상태가 되지 않는다.
  • Isolation(독립성)
    • 참조/갱신이 충돌하는 경우에도 일관성이 없는 상태가 되지 않도록 배타 제어가 가능하다.
  • Durability(내구성)
    • 커밋 결과는 확실하게 저장되어 전원 차단이 발생해도 복구가 가능하다.

Isolation

트랜잭션 수준으로 읽기 일관성에 대한 레벨을 조절한다.
Dirty readNon-repetable readPhantom read
READ_COMMITEDpreventallowallow
READ_UNCOMMITEDallowallowallow
REPETABLE_READpreventpreventallow
SERIALIZABLEpreventpreventprevent
  • Dirty Read
    • 커밋되지 않고 어떤 트랜잭션에서 쓰기가 진행 중인 데이터를 다른 트랜잭션에서 읽을 수 있도록 허용할때 발생하는 현상
  • Non-repeatable read
    • 단일 트랜잭션 내에서 같은 쿼리를 두 번 수행 할 때 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제함으로써 두 쿼리의 결과가 다르게 나타나는 현상
  • Phantom Read
    • 한 트랜잭션 안에서 일정 범위의 레코드를 두 번 이상 읽는 쿼리를 보냈을 때, 첫번째 쿼리에는 없던 레코드가 두번째 쿼리에서 나타나는 현상

Propagation

트랜잭션이 전파되는 방식에 대한 정의
  • MANDATORY
    • 현재 사용가능한 트랜잭션이 반드시 존재 해야만 한다. 그렇지 않으면 컨테이너에서 예외를 발생시킨다.
  • NESTED
    • 같은 물리적인 트랜잭션을 사용하도록 하지만 복수의 세이브포인트를 가지고 있어 하위 트랜잭션에서 독립적으로 롤백이 가능하다. 전형적으로, JDBC의 세이브포인트와 매핑되며 JDBC resource trasactions와만 동작한다.
  • NEVER
    • 현재 사용가능한 트랜잭션이 반드시 존재 하지 않아야 한다. 만약, 존재한다면 컨테이너에서 예외를 발생시킨다.
  • NOT_SUPPORTED
    • 만약 현재 사용가능한 트랜잭션이 있다면 정지시키고, 트랜잭션의 바깥에서 수행되도록 한다.
  • REQUIRED
    • 만약 현재의 빈 메서드 수행 컨텍스트에서 이미 열려있는 트랜잭션이 있다면 같은 트랙잭션을 사용하도록 한다. 각각의 트랜잭션들은 하나의 물리적인 트랜잭션 안에서 독립된 논리적인 트랜잭션에서 수행된다. 만약, 하위 트랜잭션이 롤백을 야기하면, 상위 트랜잭션 커밋에 실패하게 되고 트랜잭션의 롤백을 수행하게 된다.
  • REQUIRES_NEW
    • 항상 컨테이너에 의해 새로운 물리적인 트랜잭션이 생성되도록 한다. 하위 트랙잭션들은 독립적으로 커밋 또는 롤백을 수행할 수 있다. 상위 트랜잭션은 하위 트랜잭션에 영향을 받지 않는다. 왜냐하면 각각의 트랜잭션들은 독립된 물리적인 트랜잭션에서 수행되기 때문이다. 
  • SUPPORTS
    • 현재 사용가능한 트랜잭션이 있다면 그 안에서 수행되도록 하고, 없다면 트랜잭셔널 하지 않게 어쨌든 수행한다.