2단계 커밋 (2-phase commit)이란?
첫 번째 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단계 커미트라고 불리는 프로토콜을 사용할 수 있다. 만일 데이터베이스의 수정이 성공적으로 이루어지지 않은 경우에, 그 트랜잭션은 롤백 상태가 되어 트랜잭션이 개시되기 이전의 상태로 되돌아간다. 만약 그 트랜잭션이 관련된 컴퓨터들에 의해 성공적으로 종료되었다면, 모든 데이터베이스의 수정을 위한 커미트가 이루어지며, 새로운 트랜잭션들이 자유로이 접근할 수 있도록 자원에 걸려 있던 로크들이 풀어진다. 아래에 이 프로토콜에 관한 간략한 설명이 있다.
|
응용 프로그래머에게 있어서의 2단계 커미트는 BEGIN, COMMIT, 그리고 필요한 경우 ROLLBACK 등의 프로그램 요청을 함으로써 구현된다.
'용어' 카테고리의 다른 글
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 |