자바스터디 네트워크 [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
'Dev... > 플밍 관련 자료' 카테고리의 다른 글
[펌] 자바 관련 여러가지... (0) | 2005.02.11 |
---|---|
[펌] Tomcat5 db pool 사용 (0) | 2005.02.11 |
[펌] 자바로 구현하는 트렌젝션 프로그래밍(1) (0) | 2005.02.11 |
[펌] web.xml 의 값 읽어오기 (0) | 2005.02.11 |
[펌] 대용량 insert/update/delete || 배치작업 (0) | 2005.02.11 |