오라클 DB와 msSQL DB에 각각 데이터를 insert 하는데
원자성이 보장되어야 할 경우
한 쪽에서 오류가 난다면 어떻게 해야할까?
이를 하나의 트랜잭션으로 묶어 roll-back 시키는 기능이 필요해진다.
그러나 이러한 기능은 각각의 DBMS에서 실행할 수 없으므로 외부에서 이 작업을 수행해주어야 한다.
이럴 때 필요한 것이 XA(eXtended Architecture) Transaction이다.
본격적인 개념 설명에 앞서 분산 트랜잭션에 대해 알아둘 필요가 있다.
분산 트랜잭션(Distributed Transaction)
= 전역 트랜잭션(Global Transaction)
하나 이상의 트랜잭션 집합. 통합으로 관리된다.
여러개의 분산된 resource들(예: Database) 각각에 대한 transaction들을 하나의 transaction으로 묶은 것을 의미한다.
이 경우 하나의 resource라도 실패하면 전체를 rollback하게 된다.
트랜잭션은 같은 DB에 존재할 수도 있고, 다른 DB에 존재할 수 있는데,
이를 트랜잭션 브랜치(Transaction Branch)라고 한다.
※ 전역 트랜잭션(Global Transaction) <-> 지역 트랜잭션(Local Transaction)
※ 지역 트랜잭션(Local Transaction) : 같은 리소스 내에서 일어나는 독립적인 일들을 하나로 묶어놓은 것을 말한다.
분산 트랜잭션의 대표적인 예로 XA(eXtended Architecture)가 있다.
XA(eXtended Architecture)
확장된 아키텍처.
턱시도, 티맥스와 같은 TP모니터(미들웨어)를 통해 XA모드가 이루어진다.
지역 트랜잭션(Local Transaction)과 전역 트랜잭션(Global Transaction) 의 2단계 커밋이 XA의 기본 룰이다.
(트랜잭션 관리자(TMS)를 두어 트랜잭션 전체를 관리하게 한다.)
XA의 반대 용어로는 Non-XA 가 있으며, Non-XA는 기본적인 로컬 트랜잭션을 뜻한다.
XA와 Non-XA를 혼용해서 사용하기도 한다.
(에러 났을 때 Non-XA를 통해 로그 commit)
XA 특징
- TP-Moniter가 트랜잭션 처리를 담당한다.
- DB변경 서비스 or 분산 트랜잭션일 경우 XA를 권장한다.
- non-XA보다 Overhead가 10~25% 정도 발생한다.
non-XA 특징
- 트랜잭션 처리를 AP 안에서 User가 설정한다.
- DB조회 서비스 or 하나의 서비스 안에서 모든 루틴이 이루어질 경우 권장한다.
(Service 내에서 commit 또는 rollback이 이루어져야 한다.)
관련 용어
Transaction Manager(TM)
각 RM별로 XID를 생성하여 transaction 진행을 관리하고
전체 RM들의 transaction을 commit하거나 rollback하는 기능을 수행한다.
※ XID : 트랜잭션 ID. 각각의 트랜잭션 브랜치를 구분하기 위해 사용한다.
하나의 XID는 트랜잭션 브랜치 ID와 분산 트랜잭션 ID로 구성된다.
Transaction Processing Monitor(TPM)
통신 프로그램 및 프로세스 관리, 트랜잭션 관리 등 관리의 어려운 부분을 쉽게 처리해주는
미들웨어의 한 종류로 오라클의 Tuxedo나 티맥스의 Tmax와 같은 제품이 있다.
TM은 XA interface를 통해 RM과 통신하게 되는데 TPM을 사용할 경우
이러한 부분은 직접 코딩하지 않아도 된다는 장점이 있다.
Resource Manager(RM)
리소스 관리용. 흔히 DBMS를 지칭한다.
각각의 리소스 매니저(데이터베이스)에는 하나의 XA DataSource 객체가 존재하고,
이 XA DataSource가 XA Connection을 생성한다.
(각각의 XA Connection으로부터 하나의 XA Resource 객체를 얻어올 수 있다.)
※ 하나의 XA Resource 객체에 하나의 트랜잭션 브랜치가 있다.
* 출처 및 참고
https://heni.tistory.com/10https://nowod.tistory.com/13
'DataBase' 카테고리의 다른 글
MySQL : Access denied for user '계정명'@'localhost' (using password: YES) (0) | 2023.02.26 |
---|