본문 바로가기

Dev.../플밍 관련 자료

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

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




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

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

 

 

1.   EJB Transaction Model

 

지금까지 트렌젝션이 무엇인지, 그리고 Java에서 어떤식으로 트렌젝션이 구현되는지에 대해서 살펴보았다. 이번에는 J2EE 핵심 기술이라고도 있는 EJB에서의 트렌젝션 처리에 대해서 알아보기로 하자.

 

Declarative transaction demarcation (선언적 트렌젝션 정의)

 

EJB에서의 트렌젝션은 앞에서 우리가 봐왔던 복잡한 트렌젝션 처리들을 EJB내부에서 대부분 EJB Container 통해서 자동으로 처리해주도록 되어 있다. EJB에서는 트렌젝션 자동 처리를 위해서 몇가지 트렌젝션 모델을 미리 정해놓고 있는데, 이를 Declarative transaction이라고 하고, EJB Deployment Descriptor에만 내용을 정의해놓으면 간단하게 트렌젝션을 핸들링할 있다. 그럼 지금 부터, Declarative Transaction 종류와, 내용에 대해서 살펴보도록 하자

1) Required:

 

Required 정의된 메소드들은 모두 트렌젝션내에서 수행되게 된다. 해당 메소드가 CALL 되었을때, 이미 트렌젝션이 수행되고 있을경우에는 트렌젝션이 Propagation 되서, 트렌젝션 내에서 수행이 되는 것이고, 수행중인 트렌젝션이 없을 경우에는 새로운 트렌젝션을 만들어서, 새로운 트렌젝션내에서 메소드를 수행한다.

 

Required 속성을 사용하면 수행되는 액션이 트렌젝션의 보호아래서 수행되기 때문에, 데이타를 바꾸는 작업(update,delete)중에 유용하게 사용될 있다.

2) Required New:

 

Required New 정의된 메소드는 언제나 새로운 트렌젝션내에서 수행하게 된다. 해당 메소드가 호출 되었을때, 호출한 클라이언트가 트렌젝션을 시작하지 않은 상태이면 ( 트렌젝션 내가 아니라면) 새로운 트렌젝션을 시작하게 된다.

 

반대로, 만약에 클라이언트가 트렌젝션을 시작해서, 해당 메소드가 호출되는 시점이 트렌젝션중이라면, 이미 수행중인 트렌젝션을 잠시 중지하고, 호출된 메소드를 처리하기 위한 새로운 트렌젝션을 처리하여, 메소드가 수행된후에 이전에 중지된 트렌젝션을 다시 수행한다.

 

이렇게 되면, 만약 Required New 속성으로 지정된 트렌젝션은 외부 트렌젝션과 상관없이 작동이 된다. 예를 들어 설명하자.

TX_A_BEGIN

DoSomething1

 

RequiredNewMethod(); // Required New – TX_B

 

DoSomething2

TX_A_END

 

TX_A 안에서 RequiredNewMethod()라는 메소드가 Requried New라는 속성으로 정의되었을 경우, DoSomething1 까지 수행한후, TX_A SUSPEND한다음에, RequiredNewMethod()라는 메소드 안에 정의된 내용들을 새로운 트렌젝션 TX_B 내에서 수행하고, 수행된 내용을 commit한다. 그리고 TX_A 복귀하여, RESUME한후, DoSomething2 수행한후, 트렌젝션 A 끝낸다.

 

TX_B TX_A 안에 포함된 형태이기는 하지만, TX_B rollback되었다고, TX_A rollback되지는 않는다(failure localized).

반대로, DoSomething2에서 TX_A rollback되었다고, TX_B rollback되지 않는다. 이런 특성은 log 남기는 기능등에서 유용하게 사용될 있다.  트렌젝션내에 포함은 되어 있지만 전혀 별도의 트렌젝션으로 수행이 되는 것이다.

 

대신 무조건 새로운 트렌젝션을 생성하기 때문에, 그에 따른 시스템 오버해드가 있기 때문에 남용할만한 속성은 아니다.

 

 3) Supports

 

Support 속성으로 정의된 메소드는 호출하는 클라이언트의 트렌젝션 속성을 그대로 이어받는다. Support 속성으로 정의된 메소드를 클라이언트가 트렌젝션 범위 내에서 호출 했으면 메소드도 같은 트렌젝션 범위내에서 수행이되고, 만약 클라이언트가 트렌젝션 없이 메소드를 호출했으면 마찬가지로 해당 메소드 역시 트렌젝션이 없이 수행이 된다.

 

4) NotSupported:

 

NotSupported 속성으로 정의된 메소드는 트렌젝션범위 밖에서 수행이 된다. 호출하는 클라이언트가 트렌젝션을 가지고 있지 않고 메소드를 호출하였다면 마찬가지로 트렌젝션이 없이 호출되나, 만약에 클라이언트가 트렌젝션 범위 내에서 NotSupported 속성으로 정의된 메소드를 호출하면, 기존의 트렌젝션을 suspend한후, 메소드의 내용을 처리한후에 다시 기존의 트렌젝션을 resume하여 기존의 트렌젝션을 마저 수행하게 된다.

5) Mandatory:

 

Mandatory 속성으로 정의된 메소드는 트렌젝션 SCOPE내에서 실행되어야 한다. Mandatory 정의된 메소드는 메소드를 호출하는 클라이언트에서 트렌젝션을 시작해서, 메소드가 트렌젝션 범위내에서 수행되도록 해야한다.

 

만약 Mandatory 정의된 메소드를 트렌젝션을 시작하지 않은 상태로 호출할 경우에는 TransactionRequiredException이나 TranscationRequredLocalException이라는 에러를 내게 된다.