Spring Transaction

2010. 8. 22. 18:40plming/Java - Spring

Transaction은 ACID의 4가지 속성을 가진다.

 Atomicity
 (원자성)
 트랜잭션 내에 있는 모든 작업이 완료되거나 모든 작업이 완료되지 않아야 한다.  즉, 트랜잭션 내의 작업 중 하나라도 에러가 발생하면 트랜잭션 내의 모든 작업이 Rollback되어야 한다.
 Consistency
 (일관성)
 트랜잭션 중에 오류 없이 유효한 데이터만 데이터베이스에 저장되어야 한다.
 Isolation
 (격리성)
 트랜잭션 중에 변경된 내용이 트랜잭션이 완료되기 전까지 다른 트랜잭션에 영향을 미쳐서는 안된다.
 Durability
 (지속성)
 트랜잭션이 완료된 경우 시스템 고장이나 네트워크 에러 등으로 데이터가 유실되지 않고 정상적으로 기록되어야 한다.

Spring 프레임워크는 PlatformTransactionManager, TransactionDefinition, TransactionStatus 3개의 인터페이스를 사용한다.


1. TransactionDefinition
   트랜잭션의 ACID 속성 중 개발자들이 제어 가능하도록 트랜잭션 전달(Propagation), timeout, read-only 상태, 격리성(Isolation) 레벨를 추상화하고 있다.

 getTimeout()  실행하는 트랜잭션이 시작해서 종료할 때까지의 시간을 초 단위로 제어하는 것이 가능하다.
 isReadOnly()  실행하는 트랜잭션이 read-only 상태인지 아닌지를 결정하는 것이 가능하다.
 getIsolationLevel()  실행하는 트랜잭션의 격리 레빌을 지정하는 것이 가능하다. 즉, 현재 트랜잭션 내에서 변경된 데이터가 다른 트랜잭션에 반영될지에 대한 레벨을 결정하는 것이 가능하다.
 getPropagationBehavior()  트랜잭션이 실행되어야 하는 범위에 대한 제어와 여러 개의 트랜잭션이 어떻게 상호작용하는지에 대하여 결정하는 것이 가능하다.


- 격리 레벨 (Isolation Level)

TransactionDefinition.ISOLATION_DEFAULT :
개별적인 PlatformTransactionManager를 위한 디폴트 격리레벨

TransactionDefinition.ISOLATION_READ_UNCOMMITTED :
격리레벨중 가장 낮은 격리 레벨이다. 이 격리레벨은 다른 Commit되지 않은 트랜잭션에 의해 변경된 데이터를 볼 수 있기 때문에 거의 트랜잭션의 기능을 수행하지 않는다.

TransactionDefinition.ISOLATION_READ_COMMITTED :
대개의 데이터베이스에서의 디폴트로 지원하는 격리 레벨이다. 이 격리 레벨은 다른 트랜잭션에 의해 Commit되지 않은 데이터는 다른 트랜잭션에서 볼 수 없도록 한다. 그러나 개발자들은 다른 트랜잭션에 의해 입력되거나 수정된 데이터는 조회할 수는 있다.

TransactionDefinition.ISOLATION_REPEATABLE_READ :
ISOLATION_READ_COMMITED 보다는 다소 조금 더 엄격한 격리레벨이다. 이 격리레벨은  다른 트랜잭션이 새로운 데이터를 입력했다면, 새롭게 입력된 데이터를 조회할 수 있다는 것을 의미한다.

TransactionDefinition.ISOLATION_SERIALIZABLE :
가장 많은 비용이 들지만 실뢰할만한 격리레벨을 제공하는 것이 가능하다. 이 격리레벨은 하나의 트랜잭션이 완료된 후에 다른 트랜잭션이 실행하는 것처럼 지원한다.


- 전달 행위 (Propagation Behavior)

TransactionDefinition.PROPAGATION_REQUIRED :
이미 하나의 트랜잭션이 존재한다면 그 트랜잭션을 지원하고, 트랜잭션이 없다면, 새로운 트랜잭션을 시작한다.

TransactionDefinition.PROPAGATION_SUPPORTS :
이미 트랜잭션이 존재한다면 그 트랜잭션을 지원하고, 트랜잭션이 없다면 비-트랜잭션 형태로 수행한다.

TransactionDefinition.PROPAGATION_MANDATORY :
이미 트랜잭션이 존재한다면 그 트랜잭션을 지원하고 활성화된 트랜잭션이 없다면 예외를 던진다.

TransactionDefinition.PROPAGATION_REQUIRES_NEW :
언제나 새로운 트랜잭션을 시작한다. 이미 활성화된 트랜잭션이 있다면, 일시정지한다.

TransactionDefinition.PROPAGATION_NOT_SUPPORTED :
활성화된 트랜잭션을 가진 수행을 지원하지 않는다. 언제나 비-트랜잭션적으로 수행하고 존재하는 트랜잭션은 일시정지한다.

TransactionDefinition.PROPAGATION_NEVER :
활성화된 트랜잭션이 존재하더라도 비-트랜잭션적으로 수행한다. 활성화된 트랜잭션이 존재한다면 예외를 던진다.

TransactionDefinition.PROPAGATION_NESTED :
활성화된 트랜잭션이 존재한다면 내포된 트랜잭션으로 수행된다. 작업수행은 TransactionDefinition.PROPAGATION_REQUIRED으로 셋팅된것처럼 수행된다.


2. TransactionStatus
   트랜잭션의 상태를 관리하는 역할
   PlatformTransactionManager에서 트랜잭션을 Commit 할지 Rollback 할지를 결정하기 위해서 사용


3. PlatformTransactionManager
   실질적인 트랜잭션을 실행하는 역할


[출처] Spring 프레임워크 워크북