본문 바로가기
Oracle/운영

Two-Phase Commit 매커니즘

by 취미툰 2021. 3. 10.
반응형

Two-Phase Commit

로컬 데이터베이스의 트랜잭션 처리와 다르게 분산 트랜잭션에는 여러 데이터베이스의 데이터 변경이 포함됩니다.

즉, 분산 트랜잭션 환경에서는 전체 트랜잭션이 커밋되거나 전체 트랜잭션이 롤백됩니다.

데이터베이스는 Two-Phase Commit 매커니즘을 사용하여 분산 트랜잭션에서 데이터의 무결성(integrity)를 보장합니다.

Two-phase commit은 prepare phase와 commit phase로 나누어집니다.

prepare phase 단계에서 트랜잭션의 시작 노드(분산 트랜잭션을 일으킨 노드)는 다른 참여 노드에게 트랜잭션 커밋 또는 롤백을 수행해도 되는가 확인하는 단계입니다.

commit phase 단계에서 시작 노드는 모든 Node에서 Prepared상태가 되면 Commit이 수행됩니다. 그러나 한 Node라도 Abort 되면 Commit phase에서 전 Node에 Rollback을 수행합니다.

 

Prepare Phase

Prepare Phase는 Prepared,Read-only,Abort 세가지의 응답이 있습니다.

Prepared : 노드의 데이터가 성공적으로 수정되었으며 준비되었음을 의미합니다.

Read-only : 노드의 데이터가 수정되지 않았고 준비가 필요하지 않습니다.

Abort : 노드가 준비되지 않았음을 의미합니다.

 

prepare phase를 완료하기 위해 각 노드는 다음 단계를 수행합니다.

1.노드는 하위항목 즉, 이후에 참조되는 노드가 커밋을 준비하도록 요청합니다.

2.노드는 트랜잭션이 자체노드 또는 이후에 참조되는 노드의 데이터를 변형하는지 여부를 확인합니다.

데이터에 변경사항이 없으면 노드는 나머지 단계를 건너 뛰고 Read-only 응답을 반환합니다.

3.노드는 데이터가 변경된 경우 트랜잭션을 커밋하는데 필요한 리소스를 할당합니다.

4.노드는 트랜잭션이 변경한 내용에 해당하는 리두 레코드를 리두 로그에 저장합니다.

5.노드는 트랜잭션에 대해 보유하고 있는 lock이 실패에서 살아남을 수 있음을 보장합니다.

6.노드는 Prepared 응답 또는 prepared하려는 하위 항목 중 하나의 시도가 실패한 경우 Abort응답을 시작노드에 응답합니다.

 

이러한 작업단계들은 노드가 이후에 노드에서 트랜잭션을 커밋하거나 롤백할 수 있음을 보장합니다. prepared 노드는 global coordinator로부터 커밋 또는 롤백 요청이 올때까지 대기합니다.

 

 

commit phase

분산 트랜잭션 커밋의 두 번째 단계입니다. 이 단계가 발생하기 전에 분산 트랜잭션에서 모든 노드는 prepared 되었는지 즉 트랜잭션을 커밋하는데 필요한 리소스가 있는지 확인합니다.

 

commit phase를 수행하기 위해서는 다음 단게를 수행합니다.

1.global coordinator는 커밋지점에 커밋하도록 지시합니다.

2.커밋지점에 커밋을 수행합니다.

3.커밋지점은 global coordinator에게 커밋되었음을 알립니다.

4.global ,local coordinator는 모든 노드에 트랜잭션 커밋을 지시하는 메시지를 보냅니다.

5.각 노드에서 데이터베이스는 분산 트랜잭션의 로컬 부분을 커밋하고 lock을 해제합니다.

6.각 노드에서 데이터베이스는 로컬 리두 로그에 추가 리두 항목을 기록하여 트랜잭션이 커밋되었음을 나타냅니다.

7.참여 노드는 global coordinator에게 커밋되었음을 알립니다.

 

 

글로벌 데이터베이스 일관성 보장

커밋된 각 트랜잭션에는 해당 트랜잭션 내에서 SQL문에 의해 수행 된 변경사항을 고유하게 식별하기 위한 SCN이 있습니다. 

분산 시스템에서 통신 노드의 SCN은 다음 작업이 모두 발생할 때 조정됩니다.

- 하나 이상의 database link 를 사용하여 연결 발생시

- 분산 SQL문이 실행될 때

- 분산 트랜잭션 커밋이 발생할 때

 

prepare phase에서 데이터베이스는 트랜잭션에 관련된 모든 노드에서 가장 높은 SCN으로 결정합니다. 그런 다음 트랜잭션은 커밋 지점에서 높은 SCN으로 커밋됩니다. 커밋 SCN은 커밋결정과 함께 준비된 모든 노드로 전송됩니다.

 

 

정리: 

분산 트랜잭션 사용 시 여러 노드에서 사용중인 데이터의 일관성을 보장하기 위해 commit의 단계를 두 단계로 수행하는 것입니다. 각 노드의 상태가 모두 prepared 상태가 되면 commit을 수행하고 그렇지 않으면 rollback을 수행하여 일관성을 보장할 수 있습니다.

 

 

출처 : docs.oracle.com/cd/B28359_01/server.111/b28310/ds_txns003.htm#ADMIN12222

출처 : haisins.epac.to/wordpress/?p=2704

 

 

반응형

'Oracle > 운영' 카테고리의 다른 글

PK 컬럼추가(PK 재생성)(Oracle,Tibero,Mysql)  (0) 2021.04.05
dba_2pc_pending  (0) 2021.03.11
Index rebuild  (0) 2021.02.16
[RAC] 12.2 CRS Process 강제로 kill 하고 복구방법  (0) 2021.02.08
dba_tables 과 dba_segments의 차이  (0) 2021.02.05

댓글