반응형

Spring - Transaction Management


(원문 위치 : http://www.tutorialspoint.com/spring/spring_transaction_management.htm )

Database transaction은 작업(work)의 한단위(single unit)으로써 취급되는 동작의 순서(sequence of action)이다. 이 동작은 완전하게 완료이거나 전혀 영향이 없다.(Action should either complete entirely or take no effect at all. - 우리나라에서는 all or nothing이라는 표현으로 많이 사용한다.) Transaction 관리는 enterprise프로그램의 중요한 부분이고 data의 무결성(integrity)과 정합성(consistency)를 확실하게 하기 위한 RDBMS 지향적 enterprise 프로그램이다. Transaction의 개념(concept)은 아래와 같이 4가지 특성(property)로 설명될 수 있다.

ACID:

  • Atomicity(유일성, 원자성): Transaction은 운영의 전체 절차가 성공이거나 실패를 의미하는 운영의 단일 단위로써 취급되어질 수 있다.(--> 어렵게 생각하지 말자. 한번에 실행할 수 있는 단위여야 한다는 이야기다.)(A transaction should be treated as a single unit of operation which means either the entire sequence of operations is successful or unsuccessful.)

  • Consistency(정합성): Table의 유일한 PK(unique primary key), database의 참고적인 무결성등의 정합성을 나타낸다.(--> 어렵게 생각하지 말자. 데이터의 앞뒤가 잘 맞아야 한다는 이야기다.)(This represents the consistency of the referential integrity of the database, unique primary keys in tables etc.)

  • Isolation(고립성): Transaction 동시에 같은 데이터를 처리하는 많은 transaction이 있을 수 있다. 각각의 transaction은 데이터의 오염을 방지하기 위해 각각으로 부터 고립되어야 한다.(--> 어렵게 생각하지 말자. 죽을려면 혼자 죽지 다른넘 건드리고 그러지 말라는 소리다.)(There may be many transactions processing with the same data set at the same time, each transaction should be isolated from others to prevent data corruption.)

  • Durability(내구성, 영속성): Transaction이 완료된 이후에는 그 결과는 영속성을 갖고 system 실패로 인하여 database로부터 삭제될 수 없다.(--> 완료된 녀석은 지워지면 안된다는 소리다.) (Once a transaction has completed, the results of this transaction have to be made permanent and cannot be erased from the database due to system failure.)

실제 RDBMS database system은 각각의 transaction에 대하여 4가지 특성 모두를 보장할 것이다. SQL을 사용하는 database에 이슈(issue)가 되는transaction의 단순화된 view는 아래와 같다.
  • Begin the transaction using begin transaction command. (begin transaction 명령을 사용하는 transaction 시작)

  • Perform various deleted, update or insert operations using SQL queries. (SQL query를 사용하는 다수의 delete, update, insert 명령 수행)

  • If all the operation are successful then perform commit otherwise rollback all the operations. (모든 명령이 성공하면 commit수행, 아니면 모든 명령을 rollback)

Spring framework는 다른 transaction management API의 상단에 추상 계층을 제공한다. Spring의 transaction은 POJO에 transaction 기능(capability)을 추가하는 것으로 EJB transaction의 대체(물)를 제공하기 위한 목표를 지원한다. Spring은 프로그램적 그리고 선언적 transaction 관리를 모두 지원한다. EJB는 application server가 필요하지만, Spring transaction 관리는 application server의 필요없이 Spring transaction관리를 구현할 수 있다.

Local vs. Global Transactions

Local transaction은 JDBC connection같이 단일 transaction resource에 한정한다. 반면 global transaction은 분산시스템내의 transaction과 같이 다수의 transaction resource에 걸쳐질 수 있다.

Local transaction관리는 단일 사이트에 리소스와 프로그램 컴포넌트가 위치한 그리고 단일 머신에서 동작하는 local data manager를 호출하는 집중된 컴퓨팅 환경에서 유용할 수 있다. Local transaction은 구현하기가 상대적으로 쉽다.

Global transaction관리는 다수의 시스템에 모든 리소스가 분산된 분산 컴퓨팅 환경에서 요구된다. 이러한 경우 transaction관리는 local과 global 모두에서 되어지는것이 요구된다. 분산된 혹은 grobal transaction은 다수의 시스템을 통해 실행되어지고 이것의 실행은 global transaction management system과 system을 호출하는 모든 local data manager간의 제어(coordination)이 필요하다.

Programmatic vs. Declarative

Spring은 transaction관리의 두가지 형태를 제공한다.
  • Programmatic transaction management: 프로그램의 도움으로 transaction을 관리하는 것을 의미한다. 이는 극단적일만큼 유연함을 제공하지만 유지하기가 어렵다.(This means that you have manage the transaction with the help of programming. That gives you extreme flexibility, but it is difficult to maintain.)

  • Declarative transaction management: 비즈니스 코드로부터 transaction 관리를 분리함을 의미한다. Transaction을 관리하기 위해 annotation또는 XML기반 설정을 사용하면 된다. (This means you separate transaction management from the business code. You only use annotations or XML based configuration to manage the transactions.)


선천적 transaction 관리는 비록 코드를 통해 transaction을 제어(control)하는 것을 허용하는 프로그램적 transaction관리에 비해 유연성이 떨어지지만 바람직하다.(preferable) 하지만, crosscutting concern의 한 종류로서 선천적 transaction 관리는 AOP접근으로 모듈화되어질 수 있다. Spring은 Spring AOP framework로 선천적 transaction 관리를 지원한다.

Spring Transaction Abstractions

Spring transaction 추상화의 key는 org.springframework.transaction.PlatformTransactionManager interface에 아래와 같이 정의되어있다.
public interface PlatformTransactionManager {
   TransactionStatus getTransaction(TransactionDefinition definition);
   throws TransactionException;
   void commit(TransactionStatus status) throws TransactionException;
   void rollback(TransactionStatus status) throws TransactionException;
}
S.N.Method & Description
1

TransactionStatus getTransaction(TransactionDefinition definition)

This method returns a currently active transaction or create a new one, according to the specified propagation behavior.

2

void commit(TransactionStatus status)

This method commits the given transaction, with regard to its status.

3

void rollback(TransactionStatus status)

This method performs a rollback of the given transaction.

TranssactionDefinition은 Spring에서 transaction이 지원하는 core inerface이며 아래처럼 정의되어 있다.
public interface TransactionDefinition {
   int getPropagationBehavior();
   int getIsolationLevel();
   String getName();
   int getTimeout();
   boolean isReadOnly();
}
S.N.Method & Description
1

int getPropagationBehavior()

이 함수는 전파(propagation) 동작을 반환한다. Spring은 EJB CMT로부터 모든 익숙한 transaction propagaton옵션을 제공한다.

2

int getIsolationLevel()

This method returns the degree to which this transaction is isolated from the work of other transactions.

이 함수는 transaction이 다른 transaction의 작업에서 격리(isolate)되어지기 위한 정도를 반환한다.

3

String getName()

이 함수는 transaction의 이름을 반환한다.

4

int getTimeout()

이 함수는 transaction이 완료되어야 하는 시간을 초로 반환한다.

5

boolean isReadOnly()

이 함수는 transaction이 read-only인지를 반환한다.

가능한 격리수준(isolation level)의 값은 아래와 같다.

S.N.Isolation & Description
1

TransactionDefinition.ISOLATION_DEFAULT

기본 격리 수준

2

TransactionDefinition.ISOLATION_READ_COMMITTED

dirty read가 방해받았음을 표시. 비반복적 읽기(non-repeatable)와 유령 읽기(phantom)가 발생할 수 있다.

** 더티 읽기(dirty read): 더티 읽기는, 트랜잭션이 객체를 갱신하고 갱신이 커밋되기 전에, 다른 트랜잭션이 이 객체를 검색/갱신하도록 허용되었을 때 발생한다

** dirty read : 

한 트랜잭션이 다른 트랜잭션이 일으킨 커밋되지 않은 변경을 볼 수 있음
커밋되지 않은 변경이 롤백되면, 다른 트랜잭션은 dirty data를 가짐

** repeatable read :
질의가 몇번 만들어졌는지와 트랜잭션이 읽는 행들에 다른 트랜잭션이 변경을 몇번 가했는지에 관계 없이 트랜잭션이 동일 질의에서 항상 동일한 데이터를 읽을 때 나타남
이는 읽기를 행하는 트랜잭션은 다른 트랜잭션이 만든 커밋된 변경을 보지 않을 것이다.

** phantom read:
2번의 읽기 트랜잭션 사이에 새로운 행이 추가되었다면, phantom read일 경우 이 phantom row가 보이고
그렇지 않다면 1번째 읽기와 같은 결과가 보인다.
3

TransactionDefinition.ISOLATION_READ_UNCOMMITTED

dirty read, 비반복 읽기, 유령읽기가 발생할 수 있음을 표시.

4

TransactionDefinition.ISOLATION_REPEATABLE_READ

dirty read와 비반복 읽기가 방해받았음을 표시. 유령읽기는 발생할 수 있다.

5

TransactionDefinition.ISOLATION_SERIALIZABLE

dirty read, 비반복 읽기, 유령읽기가 방해받았음을 표시

Following are the possible values for propagation types:

전파(propagation)타입을 위해 가능한 값은 아래와 같다.

S.N.Propagation & Description
1

TransactionDefinition.PROPAGATION_MANDATORY

현재 transaction을 지원. 만약 현재 transaction이 없으면 exception 발생

2

TransactionDefinition.PROPAGATION_NESTED 

현재 transaction이 있다면 nested transaction에서 실행

3

TransactionDefinition.PROPAGATION_NEVER 

현재 transaction 지원 안함. 만약 현재 transaction이 있다면 exception 발생

4

TransactionDefinition.PROPAGATION_NOT_SUPPORTED 

현재 transaction지원 안함. 오히려 항상 non-transaction하게 실행.

5

TransactionDefinition.PROPAGATION_REQUIRED 

현재 transaction 지원. 만약 없으면 새로 하나 생성

6

TransactionDefinition.PROPAGATION_REQUIRES_NEW 

새로운 transaction 생성. 만약 이미 존재하면 현재 transaction을 멈춘다(suspend)

7

TransactionDefinition.PROPAGATION_SUPPORTS 

현재 transaction 지원. 만약 없으면 non-transaction하게 실행

8

TransactionDefinition.TIMEOUT_DEFAULT 

transaction system에 기반한 기본 timeout 사용 또는 timeout이 지원되지 않으면 none 사용.

TransactionStatus interface는 transaction 실행(execution)과 transaction 상태 질의(query)를 제어(control)하기 위한 transaction code를 위한 간단한 방법을 제공한다.

public interface TransactionStatus extends SavepointManager {
   boolean isNewTransaction();
   boolean hasSavepoint();
   void setRollbackOnly();
   boolean isRollbackOnly();
   boolean isCompleted();
}
S.N.Method & Description
1

boolean hasSavepoint()

이 함수는 transaction이 내부적으로 savepoint 즉, save point를 기반으로 nested transaction으로써 생성되어진 transaction인지를 반환한다.

2

boolean isCompleted()

이 함수는 transaction이 완료되었는지 즉, 이미 commit 또는 rollback되었는지를 반환한다.

3

boolean isNewTransaction()

이 함수는 존재하는 transaction이 새로 생성된 경우 true를 반환한다.

4

boolean isRollbackOnly()

이 함수는 transaction이 rollback-only로써 표시되었는지를 반환한다.

5

void setRollbackOnly() 

이 함수는 transaction rollback-only를 설정한다.



반응형

+ Recent posts