분산 트랜잭션(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
•모든 Participant가 YES 응답 → Coordinator가 COMMIT 지시 전달
•하나라도 NO → Coordinator가 ROLLBACK 지시
•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를 보관한다.
'Admin' 카테고리의 다른 글
| WITH GRANT OPTION이 필요한 진짜 이유 – VIEW와 PROCEDURE에서의 차이 (0) | 2026.01.28 |
|---|---|
| Flashback query, Flashback Versions Query (0) | 2026.01.05 |
| ORACLE 청크 공간 재사용 테스트, clob (1) | 2025.12.30 |
| Diagnostic Pack / Tuning Pack (0) | 2025.07.03 |
| 롤(role) 과 권한(privilege) (1) | 2025.06.04 |