새로운 프로젝트를 진행하면서 트랜잭션 2PC 개념에 대해 살펴보라는 피드백을 받고 2PC에 조사하고 정리한 내용을 포스팅 하고자한다.
우선, 트랜잭션 2PC를 살펴보기 전에 트랜잭션 개념부터 정리하자.
트랜잭션 ( Transaction, Tx )
트랜잭션이란 시작과 끝이 있는 독립적인 일 여러 개를 하나로 묶어놓고 그 중 어느 하나라도 실패하면 모든 일들을 시작하기 전 상태로 돌리는 하나의 작업 단위를 말한다. 여러 개의 일을 각각으로 나눠서 처리하지만, 만약 한가지 일이라도 실패한다면 그룹화된 여러 개의 일에 적용되었던 부분들을 취소시키고 이전 상태로 되돌린다는 의미이다. 은행간의 이체를 예를 들어보자.
A가 B에게 송금을 하는 과정은 크게 보면 2개의 단계로 나눠질 수 있다.
1) A의 계좌에서 송금할 금액을 꺼낸다.
2) B의 계좌에 송금받은 금액을 넣는다.
만약 A의 계좌에서 송금할 금액을 꺼내는 데는 성공했지만 B에게 송금할 금액을 넣다가 실패하는 경우 1)의 과정을 다시 원상태로 복구시킨다. 하나의 과정이라도 실패하는 경우 이전상태로 되돌리는 그룹화된 일련의 과정들의 묶음을 트랜잭션이라고 할 수 있다.
위의 방법의 단점으로 꼽을 수 있는 점은 1)의 과정은 항상 2)의 과정이 실패할 수 있음을 염두해 두어야 하며, 2)의 과정이 실패한경우 불필요한 1)의 과정이 선행된다는 단점을 갖는다.
이 문제를 해결하기 위해 고안된 방법중의 하나가 트랜잭션 2PC이다. Two-Phase Commit의 약자로, 독립적인 일들을 완료하는 과정을 [준비], [결과 반영] 두 단계로 나누고 모든 일들이 [준비]가 끝났을 때에만 [결과 반영]을 시도한다. 쉽게 말하면, 모든 과정이 성공할 것인지 여부를 확인하는 단계를 중간에 하나 두어, 트랜잭션에 해당되는 모든 일들이 성공할 [준비] 가 완료된 상태에서만 [결과 반영]을 진행한다는 것이다. 바로 위에서 설명한 트랜잭션의 단점을 극복할 수 있는 방법이다.
2PC는 번거러움을 없애기 위해 만든 알고리즘은 아니다. 전산 시스템에서 [결과 반영]을 하고 나면 되돌리기가 어렵기 때문에 먼저 [결과 반영]이 되지 않도록 하는 예방책이다. 그런 점에서 2PC가 필요하다.
트랜잭션의 2PC(Two-Phase Commit) 알고리즘
2PC에서 사용되는 용어부터 살펴보자.
<begin> - 시작 : 독립적인 일을 시작하는 것
<end> - 끝 : 준비 이전까지 일을 끝내는 것
<prepare> - 준비
<commit> - 결과 반영
진행단계
begin -> end -> prepare -> commit
위의 단계를 거쳐 하나의 독립적인 일을 처리하고, 독립적인 일들을 묶어서 하나의 단위로 처리하는 것이 트랜잭션이다. 트랜잭션이 성공하기 위해서는 모든 독립적인 일들이 <prepare> 준비가 되어야 한다. 그렇게 모든 일이 <준비>가 된 상태에서만 각각 커밋을 해서 트랜잭션이 성공으로 끝난다.
어느 하나의 일이라도 <prepare> 준비가 실패하면 <begin> 시작단계로 돌아가야만 한다. 돌아가는 것이 바로 rollback 롤백이다. 롤백이 되는 경우는 <begin>, <end> 도 마찬가지이다. 트랜잭션의 <prepare> 준비 단계가 완전히 성공해서 <commit>이 시작되면 완전히 끝날 때까지 계속 해야 한다. 만약 <prepare> 완료후 <commit>시도시에 실패한다면..... 그건 관리자가 직접 해결해야 한다.