Spring Transaction
2010. 8. 22. 18:40ㆍplming/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 프레임워크 워크북
'plming > Java - Spring' 카테고리의 다른 글
Spring Transaction - 선언적으로 처리 (0) | 2010.08.22 |
---|---|
Spring Transaction - 프로그램에서 처리 (1) | 2010.08.22 |
Spring - 빈 설정 파일 관리 (0) | 2010.08.22 |
Spring AOP - Logging, Exception 구현 (0) | 2010.08.19 |
Spring AOP (Aspect Oriented Programming) (0) | 2010.08.19 |