728x90

2단계 커밋 (2-phase commit)이란?

2단계 커밋은 커밋(Commit)과 취소(Abort)를 수행하는데 두 단계를 거친다는 말이다.
첫 번째 phase는 준비단계로서, 데이터베이스는 커밋을 위한 모든 준비를 수행한다.
분산 트랜잭션에 참여한 모든 데이터베이스가 준비단계를 성공한 후에야 두 번째 phase인 커밋단계가 수행되는 것이다.
만약 분산 트랜잭션에 참여한 어느 한 데이터베이스라도 prepare를 실패한다면 두 번째 phase는 커밋이 아닌 취소를 수행한다.

여기서 분산 트랜잭션이란 네트워크에 분산되어 있는 자원들에 트랜잭션을 수행하는 것을 말한다.
예를 들어, 어떤 어플리케이션이 MS-SQL과 오라클에 데이터를 트랜잭션 하에서 수행해야 한다면 분산 트랜잭션이 필요하다. 대개의 경우 분산 트랜잭션은 턱시도, 티맥스, 엔트라와 같은 TP 모니터나 EJB, COM+ 등과 같은 컴포넌트 기반 미들웨어가 그 기능들을 제공한다.
분산 트랜잭션의 반대되는 개념으로서 로컬 트랜잭션은 단일 자원(데이터베이스)에 대한 커밋과 롤백을 수행하며 1-phase 커밋으로 트랜잭션을 수행한다.

 

많은 트랜잭션은 하나의 RM (보통 데이터베이스)만을 포함하고 있다. 이 경우 RM은 보통 트랜잭션을 확약하고 롤백하기 위한 대부분의 작업을 수행한다. (거의 모든 트랜잭션성 RM이 자체적인 트랜잭션 관리자를 내장하고 있는데, 이는 지역 트랜잭션, 즉 그 RM만이 참여한 트랜잭션을 처리할 수 있다.)

그러나 트랜잭션이 두 개, 혹은 그 이상의 RM (아마도 두 개의 개별적인 데이터베이스, 혹은 데이터베이스와 JMS 큐, 또는 두 개의 개별적인 JMS provider)을 포함하고 있다면 "모두 처리하든지 아니면 아무것도 처리하지 않는"다는 의미론이 그 RM 내에서 뿐 아니라 트랜잭션 내의 모든 RM에게 적용되도록 하고 싶을 것이다. 이런 경우 TPM은 2단계 확약을 전개할 것이다.

2단계 확약에서 TPM은 각 RM에게 "준비" 메시지를 보내어 그 RM이 준비가 되었고 트랜잭션을 수행할 수 있는지 물어본다. 모든 RM으로부터 긍정적인 답을 받으면 자신의 트랜잭션 로그에 트랜잭션이 확약되었다고 기록한 후 모든 RM에게 그 트랜잭션을 확약하라고 지시한다. 만일 어느 한 RM이라도 실패한다면, 재구동시 TMP에게 장애가 일어나는 시점에 미완으로 남아있던 트랜잭션의 상태에 대하여 질의하고, 그들을 확약하거나 혹은 롤백한다.

2단계 확약을 사회 생활에 비유해 보면 결혼식을 들 수 있다. 목사나 판사가 먼저 신랑, 신부에게 각각 "당신은 그/그녀를 당신의 남편/아내로 받아들이겠습니까?"하고 물어본다. 신랑, 신부 모두 "네"라고 대답하면 둘은 모두 결혼했음이 선언된다.; 그렇지 않다면 둘 모두 결혼하지 않은 상태로 남을 것이다. 누가 먼저 "네"라고 대답했는지에 상관없이, 한 사람은 결혼했는데 다른 쪽은 결혼하지 않은 상태로 남는 경우는 없다.



 


다음은 텀즈에 있는 2PC (2-phase commit)에 대한 정의 이다.

분산 컴퓨팅 환경에서 사용자의 트랜잭션을 처리하는데 있어, 트랜잭션 관리 프로그램은 트랜잭션에 관련된 모든 데이터베이스가 성공적으로 수정되었음을 확실하게 하기 위하여 2단계 커미트라고 불리는 프로토콜을 사용할 수 있다. 만일 데이터베이스의 수정이 성공적으로 이루어지지 않은 경우에, 그 트랜잭션은 롤백 상태가 되어 트랜잭션이 개시되기 이전의 상태로 되돌아간다. 만약 그 트랜잭션이 관련된 컴퓨터들에 의해 성공적으로 종료되었다면, 모든 데이터베이스의 수정을 위한 커미트가 이루어지며, 새로운 트랜잭션들이 자유로이 접근할 수 있도록 자원에 걸려 있던 로크들이 풀어진다.

아래에 이 프로토콜에 관한 간략한 설명이 있다.

  1. 한 컴퓨터 내에 있는 트랜잭션 관리 프로그램은 대체로 최초 요구에 연계되어, 관련된 모든 컴퓨터들을 대신하여 트랜잭션을 조정한다. 트랜잭션 관리 프로그램은 "트랜잭션 시작"이라는 내용을 로그 파일에 기재하고, 관련된 다른 컴퓨터들에게 트랜잭션 요청을 보낸다.

  2. 참여하고 있는 각 컴퓨터들은 자신의 로그에 트랜잭션을 기재하고, 다른 사용자가 쓸 수 없도록 데이터베이스 자원에 로크를 걸어 데이터베이스 변경을 수행하고, 트랜잭션 관리 프로그램에게 "커미트 할 준비가 되었다"는 메시지를 보낸다.

  3. 관리 프로그램은 관련된 모든 컴퓨터들로부터 "커미트 할 준비가 되었다"는 메시지를 받은 뒤에, 트랜잭션이 종료되었다는 사실을 로그 파일에 기재하고 나서, 모든 컴퓨터들에게 트랜잭션을 커미트 하라고 통보한다.

  4. 참여하고 있는 각 컴퓨터는 이 사실을 트랜잭션 로그 내에 기록한 다음, 자원에 걸려있던 로크를 풀어준다.

  5. 만약 모든 컴퓨터들이 트랜잭션을 커미트 하기 전의 어느 순간에 하나 이상의 컴퓨터에서 문제가 발생하면, 관리 프로그램은 트랜잭션이 시작되기 전의 상태로 되돌리도록 롤백 메시지를 전파한다.




응용 프로그래머에게 있어서의 2단계 커미트는 BEGIN, COMMIT, 그리고 필요한 경우 ROLLBACK 등의 프로그램 요청을 함으로써 구현된다. 

728x90

'용어' 카테고리의 다른 글

JEUS의 DB 연결  (0) 2010.07.28
ISV (independent software vendor)  (0) 2010.06.03
ERP (enterprise resource planning)  (0) 2010.01.21
클래스패스와 환경 변수, 그것이 알고 싶다.   (0) 2010.01.05
DBMS의 종류  (0) 2010.01.04

+ Recent posts