NDC/DB

[NDC 2015] 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현

MAKGA 2023. 1. 9. 12:48
320x100

비관적 동기화 (락 기반 동기화)

내용

__ 작업하는 동안 다른 동작을 못하게 한다.

단점

__ 모든 DB 변경에서 락을 잡아야 한다

__ 락을 잡을 수 없는 상황(서버 다운)이 있다

 

낙관적 동기화 (트랜잭셔널 메모리)

내용

__ 일단 진행하고, 문제가 생기면 롤백한다

 

 

애플리케이션 레벨에서 롤백을 구현해야 하므로 문제 영역을 나눠보자

__ 퍼스트 로컬 트랜잭션

____ 실패할 가능성이 있는 것

____ 안전하게 롤백할 수 있어야 함

____ ex) 아이템 제거, 골드 감소

 

__ 세컨드 로컬 트랜잭션

____ 실패할 가능성이 없는 것

____ 안전하게 롤백할 수 없어도 된다

____ ex) 아이템 추가, 골드 증가

 

절차

1. 모든 참여자(DB)들에게 퍼스트 LT를 실행

2. 모든 퍼스트 LT가 성공하고 나면 세컨드 LT를 실행

3. 퍼스트 LT가 하나라도 실패하면 전부 롤백

 

=> 사용되는 모든 데이터에 사용중 임을 표시하는 데이터가 필요함

=> 개별 트랜잭션마다 복구 코드를 짜야 한다


개선 아이디어

롤백할 때 해야 할 일과 세컨드 LT할 때 해야 할 일을 SQL 쿼리 텍스트로 만들어서 각 DB의 퍼스트 LT 시점에 기록한다

 

로직 코드

1. 빼앗아야 할 자원을 제거 한다

2. 퍼스트 LT를 롤백할 때 해야 할 일을 SQL 쿼리로 기록해둔다.

-> 거래가 취소되면 롤백 쿼리 실행

-> 거래 중엔 자원에 대한 권한이 없다

3. 세컨드 LT를 해야할 때 해야 할 일을 SQL 쿼리로 기록해둔다.

-> 자원이 아직 내 소유가 아니다.

 

시스템 코드: 실행 파트

1. 락을 건다.

2. 각각의 DB에 로직 코드를 호출해서 퍼스트 LT를 실행한다.

3. 하나라도 실패하면 모든 DB에 롤백을, 모두 성공하면 세컨드 LT을 실행한다.

4. 락을 해제.

 

시스템 코드: 복구 파트

1. 끝나지 않은 분산 트랜잭션이 있는지 감시.

2. 락을 시도

3. 락이 잡히면 이어서 작업하고 실패하면 이미 진행중이므로 넘어간다.


출처: http://ndcreplay.nexon.com/NDC2015/sessions/NDC2015_0071.html

320x100