JAVA공부/4-트렌젝션

2. 분산 트렌젝션(Distributed Transaction)

으노으뇨 2024. 10. 29. 00:08
728x90
반응형
SMALL

트랜젝션이 무엇이고 그 트랜젝션의 속성들을 혼자 학습했습니다.

그럼 트렌젝션이 어떻게 사용되는지 학습해보겠습니다.

1. 트랜젝션은 그래서 어떻게 실행되냐?

>>> 트랜젝션이 사작된다.
Begin Transaction //트렌젝션이 실행

if(Error) Then rollBack // 실행중 에러발생 시 롤백

Prepare Transaction.  // 상태 체크

if(prepare transaction field) then rollBack // 실패면 롤백
else Commit Transaction // 성공이면 커민

End Transaction // 트랜젝션 종료

일반적으로 프로그래밍 코드 상에서, 트랜젝션을 사용하게 된다면 위와 비슷하게 또는 같이 실행될 것이다.

그리고 대게 비슷한 구조를 가지고 있다.

1. Begain TX 

이 단계가 시작하면, 여기서부터 하나의 트랜젝션임을 알리는 Boundary의 역할을 한다.

트랜젝션에 대한 실질적인 트렌젝션 처리코드가 들어가며 통상 SQL 문장 또는 해당 로직들이 돌게 됩니다.

2. if(Error) then rollBack

트랜젝션 처리 중에 에러가 발생하면 롤백을 실행해서 수행전 상태로 되돌아 간다.

3. Prepare TX

실행 결과에 대해서 Commit이 가능한지, 아닌지 체크를 한다. 

각각 트렌젝션 대상 (Resource Managerm DBMS 등)  에서 체크를 하는 것이다.

4. if(prepare TX feild) ~ else Commit TX

커밋이  될 준비가 되었으면 커밋을 실행하고, 아닌 경우 롤백을 한다. 

모든 트랜젝션이 완료되면 종료된다.


언뜻 보기엔 당연하고 단순한 과정과 같아 보인다.

이는 트랜젝션을 처리하는 대부분의 미들웨어에서 공통적으로 사용하는 방법이다.

J2EE EJB에서 TX 처리는 대부분 이런 TX의 처리과정을 EJB Container에서 자동으로 처리한다고 한다.
(CMT : Cotainer Managed Transaction Model) 실질적으로 개발자가, 직접적으로 트렌젝션을 다룰 일은 많지 않다고 한다.

2. 분산 트랜젝션 (Distributed TX) 와 XA (eXtended Architecture)

분산 트랜젝션이란?

두개 이상의 Resource(RDBMS)를 이용해서 하나의 트랜젝션으로 처리하는 것.

분산 트랜젝션을 수행하기 위해서는 3가지의 요소가 결합된다.

1. Application

AP, 즉 유저가 트랜젝션을 발생시키고 프로그래밍하는 부분

우리가 개발하게 될 부분이 이 부분이다.

2. Resource Manager (RM)

RM은 각각의 Resource를 컨트롤 해주는 기능을 가진다.

Java에서는 일종의 JDBC 드라이버와 같은 기능을 한다.

실제로 RM의 기능을 하는 모듈은 DBMS Vendor에서 JDBC드라이버 패키지에 넣어서 배포된다고한다.

단순히 RDBMS 뿐 아니라, RM을 가지고 있는 Resource로는 XA를 지원하는 ISAM, JMS와 같은 메시징 시스템에서 부터 많은 종류가 있다.

3. TX Manager

Transaction Manager로, 전체 분산 트렌젝션을 관리해주는 역할을 한다.

WAS에 이 기능이 내장되어 있다.

4. XA

XA는 eXtended Architecture로 Open Group에 의해서 정의되었으며, Global Transaction을 관리하기 위한 귀약과 RM과 TM사이의 프로토콜을 정의한다.


그럼 분산 트랜젝션은 어떤 시나리오로 동작할까?

Begin TX
Xid =  get new TX id
doTX(Xid, RM1)
doTX(Xid, RM2)

commit TX(Xid)
End TX

1. Begin TX ~ Xid get new TX id

먼저 트랜젝션이 수행되면 그 트랜젝션에 대한 Global TX id인 Xid가 생성된다.

2. doTX(Xid, RM1) doTX(Xid, RM2)

DB1과 DB2에 각각 연결되어 있는 RM1과 RM2가 연결되어 있다면 AP가 직접 RM을 통해 DB작업을 실행한다.

이때, Xid를 같이 RM에게 보내서 지금 실행되는 작업이 어떤 트랜젝션에 관련된 작업인지를 식별할 수 있게 한다.

물론 이 작업 도중에 Error가 발생한다면 rollBack을 수행한다. 

3. commit TX(Xid)

이 작업은 TM과 RM간의 작업이다. TM이 RM1, RM2에게 Commit 할 줄비가 되었는지를 각각 RM에 물어봐 체크한다.

이때 RM은 동시에 여러개의 트랜젝션이 수행중일 수 있다. (RDBMS가 한번에 하나의 트랜젝션만 처리하고 있지는 않다.)

그래서 어떤 트랜젝션을 체크할 것인지를 구별하기 위해 TM은 RM에게 Xid를 실어서 보낸다.

이걸 Key값으로 하여 해당 Xid로 식별된 트랜젝션에 대해 Commit할 줄비가 되었는지를 물어본다. 

이 과정을 Prepare라고 한다.

*. Prepare

만약  Prepare가 된다면 TM은 RM에게 Commit을 하도록 지시한다.

만약, Prepare가 실패하면 TM은 RM에게 rollBack을 지시한다.

이렇게 Prepare과정과 커밋과정 두 단계를 거치는 것을 

"Two Phase Commit (2pc)"

이라고하며 분산 트랜젝션에서 중요한 개념이다.

4. End TX

트랜젝션을 종료하고 그 내용을 반영한다.


분산 트랜젝션의 아주 일반적인 작동원리이다. 

실제로 XA프로토콜을 이용해서, 분산 트랜젝션을 처리하는 과정은 이보다 더 훨씬 복잡하다고 한다.

728x90
반응형
LIST