'DB'에 해당되는 글 14건

  1. 2011.09.23 로컬 트랜잭션과 글로벌 트랜잭션 (local & global transaction) 1
2011. 9. 23. 18:32

로컬 트랜잭션과 글로벌 트랜잭션 (local & global transaction)

이전 글에서 트랜잭션은 여러 개의 독립적인 일들을 묶어놓은 것이라고 했었다. 그런데 여러 개가 아니라 하나의 일만 있으면 트랜잭션이 아닌걸까? 그렇지 않다. '철수가 50원을 평민은행에 입금한다'는 하나의 일을 트랜잭션의 수행 단계로 나타내면,

<시작(begin)> : 철수가 50원을 입금하겠다고 평민은행 창구에 얘기한다.

<끝(end)> : 입금 신청서 작성을 완료하고 50원을 직원에게 준다.

<준비(prepare)> : 창구 직원이 입금 서류를 완성한다.

<결과 반영(commit)> : 서류를 결제 받고 50원을 은행 금고에 넣는다.


위의 내용을 잘 살펴보자. 미리 작성한 입금 신청서와 50원을 직원에게 주면 직원은 결제 서류 만들어서 결제 받고 50원을 금고에 넣으면 그만이다. 단지 중간에 철수가 갑자기 전화를 받고 급히 50원을 써야할 때가 생길 수 있으므로 직원이 결제 받고 50원을 넣기 전에 취소를 할 수만 있으면 된다. 이때 트랜잭션 세계의 용어로는 취소가 아니라 롤백(rollback)이라는 것을 명심하기 바란다.


그러면 불필요한 단계를 없애고 간단하게 바꿔보자.

begin : 철수가 이체 신청서를 작성해서 50원을 입금하겠다고 평민은행 창구 직원에게 준다.

commit : 직원은 결제 서류 만들어서 결제 받고 50원을 금고에 넣는다.


즉, <끝>과 <준비>가 필요없이 <시작>과 <결과 반영>만으로도 충분히 트랜잭션을 할 수가 있다는 것이다. 트랜잭션을 진행하는 쪽에서는 <시작>을 한 다음 <결과 반영>을 하기 전에 문제가 생기면 <롤백>을 하면 된다. 이것이 바로 로컬 트랜잭션(Local Transaction)이다. 참고로 로컬이란 말은 지역이라는 말로 번역을 한다. 즉, 지역 트랜잭션이라고 부른다.

 

로컬 트랜잭션(Local Transaction, 번역 용어 : 지역 트랜잭션)


로컬 트랜잭션은 아래와 같이 흐름으로 나타낸다.

begin -> commit


commit 이 곧 end와 prepare를 모두 포함하고 있다고 보면 된다. 참고로 1PC는 대부분 로컬 트랜잭션으로 처리할 수 있다. 같은 리소스 내에서 일어나는 독립적인 일들을 하나로 묶으면 로컬 트랜잭션이 되는 것이다. 또한 로컬 트랜잭션은 같은 리소스 내에서 일을 하면 된다는 가정이 있기 때문에 기본적으로 일 처리가 빠르다.

 

자, 그렇다면 로컬 트랜잭션이 있으면 그에 상응하는 말로 무엇이 있겠는가? 바로 글로벌 트랜잭션이다.



글로벌 트랜잭션(Global Transaction, 번역 용어 : 전역 트랜잭션)


글로벌 트랜잭션은 트랜잭션에 참여한 여러 독립적인 일들 중 하나라도 다른 리소스에서 일어나는 경우다. 앞서 2PC의 예에서 설명한 것처럼 서로 다른 은행 간에 이체를 해야 하다면 이는 글로벌 트랜잭션이다. 그리고 글로벌 트랜잭션을 하려면 반드시 2PC를 해야만 한다. 글로벌 트랜잭션은 여러 리소스 사이에서 처리하는 작업이기 때문에 '분산' 트랜잭션(Distributed Transaction)이라고도 하며 이를 줄여서 XA 라고 부른다. XA는 이전 글에서 설명한 2PC 알고리즘을 기반으로 하고 있다.

XA 표준 문서 : http://www.opengroup.org/onlinepubs/009680699/toc.pdf


Java(자바)에서는 XA를 기초로 하여 자바 환경에서의 트랜잭션에 대해 정의하였다. 이를 JTS 라고 한다. 그리고 이에 대한 Java API를 JTA 라고 한다. JTS와 JTA 얘기를 꺼낸 이유는 WAS 가 자바를 기반으로 되어 있고, WAS의 기본 구성 요소 중 하나가 JTS와 JTA에 기반한 트랜잭션 매니저(Transaction Manager)이기 때문이다.



한 가지 주의할 점은 1PC는 글로벌 트랜잭션이라는 것이다. 글로벌 트랜잭션에 참여한 일들이 전부 같은 리소스에서 하는 일이라서 <준비> 작업을 안 해도 되겠다고 판단하는 것이지, 갑자기 로컬 트랜잭션으로 바꿔서 진행하는 것이 아니다. 정리하면 1PC는 글로벌 트랜잭션 최적화(Global Transaction Optimization) 알고리즘들 중의 하나이다.

 

그렇다면 로컬 트랜잭션을 최적화(Optimization)하는 알고리즘은 없는가? 답은 단순하다. 없다. 단지 로컬 트랜잭션을 이용해서 글로벌 트랜잭션을 최적화 하는 알고리즘이 있다. 이것도 중요한 내용이지만 나중에 WAS와 JDBC에 대해 설명할 때로 미루고자 한다.