본문 바로가기

Dev.../플밍 관련 자료

[펌] 자바로 구현하는 트렌젝션 프로그래밍(2)

자바로 구현하는 트렌젝션 프로그래밍(2)




자바스터디 네트워크 [www.javastudy.co.kr]

조대협 [bcho_N_O_SPAM@j2eestudy.co.kr]

 

1.   Java transaction

 

그럼 이제부터 자바에서 어떻게 트렌젝션을 처리하게 되어 있는지 구조를 살펴보고, 각각의 API들에 대해서 간단하게 살펴보도록 하자.

Java Transaction Model

 

Java Transaction 구성하는 API로는 크게 JTS(Java Transaction Service) JTA (Java Transaction Application) 구성이 된다.

 

JTS Transaction Manager 대한 Spec이고, JTA Application, Application Server, Resource Manager들간의 Interface 규약등을 정의하는 Spec이다.

 

일반적으로, Java 직접 Transaction Programming 할경우에는 JTA Interface 통해서  JTS 사용하게 된다. 쉽게 이야기 해서 JTS Transaction Manager, 그리고 JTA Transaction Manager 외부 인터페이스로 이해하면 된다.

 

이미 알고 있는 사람도 있겠지만, JTS 지원하는 Transaction Manager간에는 Global Transaction 가능하다. 예를 들면 WebLogic에서 EJB들을 호출하고, EJB들에서 IBM Websphere EJB 호출하면, 그것이 하나의 트렌젝션으로 묶어서 처리할 있다는 이야기다.

 

 이것이 가능한 이유는, JTS 구현된 Transaction Manager CORBA OTS(Object Transaction Service)라는 프로토콜로 Transaction Manager간에 통신을 하기 때문에,  하나의 Global Transaction으로 처리가 가능하게 되는 것이다.

 

<그림 2. JAVA Transaction API들간의 관계 >

 

그러면 각각의 Java Transaction API들을 살펴보도록 하자.

 

JTA

 

그러면 이런 일련의 트렌젝션 과정이 Java에서는 어떻게 구현되는지를 간단하게 살펴보고 넘어가도록 하자. Java에는 트렌젝션을 처리하기 위한 API Java Transaction API(이하 JTA) 제공한다. JTA에는 TM,AP,RM 상호작용을 정의하기 위해서, 아래와 같이 주요 다섯가지 인터페이스를 정의하고 있다.

 

- User Transaction Interface

- Transaction Manager Interface

- Transaction Interface

- XAResource Interface

- Xid Interface

 

1) User Transaction Interface

 

javax.transaction.UserTransaction 클래스로, AP TM간의 인터페이스를 나타낸다.

실제로 JTA 이용해서 프로그래밍을 할때는 User Transaction Interface 사용한다.( 우리가 직접 Transaction Programming 할때, 직접적으로 사용하게 되는 Interface.)

 

EJB Server내에서의 구현은

UserTransaction utx = ctx.getUserTransaction();

 

// start Transaction

utx.begin();

 

// do transaction

 :

 

utx.commit();

 

이런식으로 구현된다. ( 이렇게 EJB내에서 구현할때는 Transaction Model TX_BEAN_MANAGED 일때만 사용한다.-Bean Managed Transaction)

 

2) Transaction Manager Interface

 

javax.transaction.TransactionManager interface, TM  Application Server간의 인터페이스를 정의한다. 주로 트렌젝션간의 경계(boudary) 관리한다.

 하나의 트렌젝션에 대해서 Transaction Context 가지게 하고, 트렌젝션을 사용하는 Thread들간의 연관관계를 정의한다. 고로, 여러 Thread 하나의 Transaction으로 묶이는것과 같은 Global Transaction(분산 트렌젝션) 가능해지는 것이다.

 

 Transaction Manager Interface에서는 트렉젠셕과의 경계 관리 다음과 같은 원리로 수행하게 된다.

Transaction Context 관리하고, 각각의 Transaction Context Transaction object 의해 encapsulation 한다. 트렌젝션을 사용하는 모든 쓰레드들은 Transaction Context 대한 reference 가지게 되고, 만약 트렌젝션을 사용하지 않는 쓰레드는 값을 null 세팅한다.

 

이렇게 Transaction Manager Transaction 관리하기 위해서는 몇가지 주요 기능을 제공하는데, 기능들은 아래와 같다.

 

Starting a Transaction

전체 트렌젝션을 시작한다. 단계에서, Transaction object Transaction Context 해당 Thread Binding한다.

 

Completing a Transaction

TransactionManager.commit/rollback 이용해서, 현재 commit 호출한 Thread 트렌젝션을 완료(commit)한다. 트렌젝션의 완료가 끝나면, Thread Transaction Context null 세트한다.

 

Suspending and Resuming Transaction

현재 calling Thread 수행중인 Transaction suspend하거나, resume시킬 있다. Transaction 수행코드중간에, suspend 시키면, suspend중에 수행된 명령(SQL) Transaction 포함되지 않는다.

 

3) Transaction Interface

 

Transaction Interface 트렌젝션을 수행하기 위한, Transaction 자체의 정보를 기억한다. , 트렌젝션을 수행하기 위해서 필요한, Resource 목록을 기록하고, 트렌젝션의 commit rollback 관리한다.

 

 Transaction 생성되면, Transaction 관여 되는 Resource( RDBMS etc..) 들의 List Transaction object 바인딩 한다. (transaction.enlistResouce)

  Transaction object 관련된 Resource list 유지하고 있기 때문에. TM 현재 Transaction 관련된 RM 일괄적으로 Control ( commit시키거나, rollback 시키는것들) 가능하게 된다.

 

 그외에도, Transaction 대한 Equality Check Hash code