728x90
반응형
분산 트랜잭션
분산 트랜잭션 정의
분산 트랜잭션(영어: Distributed transaction)은 2개 그 이상의 네트워크 상의 시스템 간의 트랜잭션이다. 일반적으로 시스템은 트랜잭션 리소스(transaction resource)의 역할을 하고, 트랜잭션 매니저(transaction manager)는 이러한 리소스에 관련된 모든 동작에 대해 트랜잭션의 생성 및 관리를 담당한다. 분산 트랜잭션은 다른 트랜잭션처럼 4가지 ACID(원자성, 일관성, 고립성, 지속성) 속성을 갖추어야 하며, 여기에서 원자성은 일의 단위(UOW)를 위해 all-or-nothing 결과를 보증해야 한다.
벤더 컨소시엄의 하나인 오픈 그룹은 트랜잭션 모델 구성 요소의 동작에 대한 사실상의 표준이 된 X/Open DTP 모델을 제안하였다.
데이터베이스는 흔한 트랜잭션 자원이며 트랜잭션은 이러한 데이터베이스들을 통과한다. 이 경우 분산 트랜잭션은 여러 참여 데이터베이스 간에 동기화(ACID 속성을 제공)해야 하는 데이터베이스 트랜잭션으로 볼 수 있다.
분산 트랜잭션의 정당성을 보증하기 위한 일반적인 알고리즘은 2단계 커밋(2PC)이다. 이 알고리즘은 일반적으로 수 밀리초에서 수 분 사이의 짧은 시간 내에 커밋할 수 있는 업데이트를 위해 적용된다.
2 Phase Commit 이란?

- 투 페이즈 커밋은 여러 노드에 거쳐서 원자성 트랜잭션 커밋을 달성하기 위한 알고리즘이다.
- 분산 데이터베이스의 트랜잭션 처리를 위해서 사용하는 고전적인 방법이다.
- 2PC에서는 일반적으로 단일 노드 트랜잭션에서는 나타나지 않는 새로운 구성 요소인 코디네이터(트랜잭션 관리자)를 사용한다.
- 2PC 트랜잭션은 애플리케이션이 정상적으로 여러 데이터베이스 노드에서 데이터를 읽고 쓰는 것으로부터 시작된다.
- 커밋할 준비가 되면 트랜잭션 관리자는 1 단계를 시작한다. 그런 다음에 각 노드에 준비 요청을 보내서 커밋 가능 여부를 묻게 되며, 참가자의 응답에 따라서 커밋을 할지, 롤백을 할지 결정을 한다.
- 모든 노드가 “예” 라고 대답하여, 커밋할 준비가 되었다고 하면, 트랜잭션 매니저는 2단계에서 커밋 요청을 전송하고 커밋이 실제로 수행된다.
- 참가자가 “아니오"라고 대답하면 코디네이터는 2단계의 모든 노드에 중단 요청을 보낸다.
- 이러한 과정은 결혼식에 비유할 수 있는데, 주례자가 신랑과 신부에서 각각 결혼하고 싶은지 물어보고, 모두 결혼을 하고 싶다는 대답을 받고 나서, 결혼식을 마무리하는 과정이라고 비유를 할 수 있다.
- 여기서 주례자는 트랜잭션 매니저이며, 신랑과 신부는 각 데이터베이스 노드들이다.
2 Phase Locking 이란?


- 2단계 잠금 프로토콜은 트랜잭션 도줌에 락을 걸어서 동일한 데이터에 동시에 접근하려는 트랜잭션을 차단하여 직렬화를 보장하는
DBMS의 동시 제어 방법이다. DBMS의 동시성 문제를 해결하는데 도움이 된다.- 이 잠금 프로토콜은 트랜잭션의 실행 단계를 세 단계로 나눈다.
- 첫 번째 단계에서는 트랜잭션이 실행되기 시작할 때 필요한 락에 대한 권한을 요청한다.
- 두 번째 부분은 트랜잭션이 모든 락 권한을 얻는 부분이다. 트랜잭션이 첫 번째 락을 해제할 때 세번째 단계가 실행된다.
- 이 세 번째 단계에서는 트랜잭션이 새로운 락을 요청할 수 없으며, 대신 획득한 락을 해제할 수 만 있다.
- 따라서
2PL에서는 각 트랜잭션이 두 단계로 락 획득 또는 해제 요청을 할 수 있다.- Growing Phase: 이 단계에서는 오직 잠금을 획득할 수 있고, 해제할 수는 없다.
- Shrinking Phase: 이 단계에서는 트랜잭션이 잠금을 해제할 수는 있지만 새로운 잠금을 획득하지는 못한다.
2PL프로토콜 방식은 직렬화는 보장하지만, 교착 상태가 발생하지 않도록 보장하지 못한다는 특징이 있다.
동형 DBMS (oracle - oracle) 사이의 분산 트랜잭션 구현하기 위한 방법을 간단하게 설명

개인 로컬 PC 내의 가상머신 DBMS 와 서버실의 Oracle DBMS 간에 DB Link 생성 또는 배포한 가상머신 Oracle DBMS 와 구축한 가상머신 Oracle DBMS 간 DB Link 생성
DB LINK 생성 SQL
CREATE PUBLIC DATABASE LINK DB1 CONNECT TO scott IDENTIFIED BY "tiger"
USING '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=@localhost)(PORT=1521)))
(CONNECT_DATA=(SID_NAME=xe)))';
분산 트랜잭션 구현 시나리오 각자 작성
CREATE TABLE emp_table
( emp_id NUMBER NOT NULL,
emp_name VARCHAR2(100) NOT NULL,
gender VARCHAR2(10) NULL,
age NUMBER NULL,
hire_date DATE NULL,
etc VARCHAR2(300) NULL,
PRIMARY KEY (emp_id) );
INSERT INTO emp_table (emp_id, emp_name, gender, age, hire_date)
VALUES (1, ‘홍길동', '남성', 23, '2022-03-24');
INSERT INTO emp_table (emp_id, emp_name, gender, age, hire_date)
VALUES (2, '김영웅', '남성', 45, '2016-02-17');
INSERT INTO emp_table (emp_id, emp_name, gender, age, hire_date)
VALUES (3, '강민준', '남성', 55, '2017-03-25');
INSERT INTO emp_table (emp_id, emp_name, gender, age, hire_date)
VALUES (4, ‘이유리', '여성', 46, '2019-02-05');
COMMIT;
이후 다른 DBMS 에서 조회
SELECT * FROM EMP_TABLE@DB1;
개인프로젝트 ERD
728x90
반응형
'데이터베이스' 카테고리의 다른 글
| [데이터베이스] 모듈 Module (0) | 2022.08.13 |
|---|---|
| [데이터베이스] 커서 Cursor (0) | 2022.08.13 |
| [데이터베이스] 데이터베이스란? (0) | 2022.08.13 |
| [데이터베이스] PL/SQL (0) | 2022.08.13 |
| [데이터베이스] VIEW (0) | 2022.08.13 |