Admin

분산 트랜잭션, 2PC PENDING

돼지와함께춤을 2026. 1. 5. 14:40

분산 트랜잭션(Distributed Transaction)

개 이상의 데이터베이스(DBMS) 또는 시스템 자원에서 동시에 수행되는 트랜잭션.
2Phase Commit 프로토콜을 사용해 모든 참여 DB가 동일하게 커밋되거나 롤백되어야 원자성을 보장.
 

ORACLE 2PC PENDING은 **분산 트랜잭션(Distributed Transaction)**에서
2-Phase Commit(2PC) 이 정상적으로 완료되지 못하고 대기 상태로 남아 있는 트랜잭션을 의미.

그리하여 완료 메시지를 받지못해 판단할수 없는 트랜잭션을 미결 트랜잭션이라고 한다.

 

2PC(2-Phase Commit) 프로토콜

Phase 1: Prepare Phase

Coordinator(조정자) 가 모든 Participant(참여 DB)에게 PREPARE 요청
Participant"YES(준비됨)" 또는 "NO(실패)" 응답 전송
 

Phase 2: Commit Phase

모든 ParticipantYES 응답 → CoordinatorCOMMIT 지시 전달
하나라도 NO → CoordinatorROLLBACK 지시
Participant지시받은 대로 COMMIT/ROLLBACK 수행 후 Coordinator에 결과 보고
 

Oracle에서 분산 트랜잭션이라고 판단되는 경우

DB LINK를 사용했을 SQL 안에 원격 객체가 등장 EX) INSERT ... SELECT ...@dblink, UPDATE ...@dblink.

    경우 Oracle은 내부적으로 2PC (two-phase commit) 프로토콜을 사용 → 분산 트랜잭션 취급.

JTA / 글로벌 트랜잭션을 사용하는 경우

    WebLogic, JEUS, WAS 등 애플리케이션 서버가 XA DataSource(JTA)DB연결하여

    단일 DB에서만 작업해도, 애플리케이션 서버가 XA를 통해 커밋을 조율하므로 Oracle 입장에서는 "분산 트랜잭션"으로 간주.

 



1. DB LINK로 인한 분산 트랜잭션

 

 

  • 원격DB를 연결하는 로컬DB가 Coordinator의 역할이 된다
  • 데이터 소스는 XA나 nonXA방식을 사용할 수 있지만 일반적으론 db link를 사용한다면 nonXA방식을 채택하고
    , XA방식 구동시 DB LINK는 공유형 방식이 필요하다(일반 DB LINK생성시 오류 발생)
  • 또한 WAS-DB LINK 구조중 XA방식 사용 시 Coordinator는 로컬DB가 아닌 WAS가 된다. 
  • 미결 트랜잭션 데이터를 관리하는 2PC PENDING발생 시 각 DB 인스턴스는 자기 XID에 대한 PENDING QUEUE를 보관한다.

XA방식 구동시 DB LINK 예제

CREATE SHARED PUBLIC DATABASE LINK [DB LINK명]
CONNECT TO [연결할 원격DB계정] IDENTIFIED BY "[원격DB계정의 비번]"
AUTHENTICATED BY [연결할 원격DB계정] IDENTIFIED BY  "[원격DB계정의 비번]"
USING ‘(DESCRIPTION =
   (ADDRESS = (PROTOCOL = TCP)(HOST = [DB IP])(PORT = [DB PORT NUM]))
   (CONNECT_DATA = (SERVICE_NAME = [DB서비스명]))
)’;

// 참조 
XA 트랜잭션 환경(WAS + Oracle DB 연동)에서는공유형(Shared) Database Link 방식이 공식적으로 지원되는 구조입니다.
이 방식은 여러 세션(WAS의 Connection Pool 포함)이 동시에 동일한 DB Link를 재사용할 수 있도록 설계되어 있습니다.
단 지원이 된다는거지 XA + DB LINK는 권장되지 않는 아키텍처라고 한다

왜 AUTHENTICATED BY 절이 필요한가?
Shared Link는 여러 세션이 동시에 공유됩니다.
따라서 로컬 세션의 사용자 계정만으로는 원격 DB 접속을 처리할 수 없습니다.
그 결과, 공유 풀에 들어갈 때 사용할 원격 인증 정보를 명시적으로 지정해야 합니다.

 

 

 

 

2. 여러 DataSource로 인한 분산트랜잭션

 

  • Coordinator는 WAS(TX Manager)가 담당한다.
  • 관련 DB 인스턴스가 모두 Participant가 되며 2PC PENDING발생 시 각 DB 인스턴스는 자기 XID에 대한 PENDING QUEUE를 보관한다.