비관적 동기화 (락 기반 동기화)
내용
__ 작업하는 동안 다른 동작을 못하게 한다.
단점
__ 모든 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
'NDC > DB' 카테고리의 다른 글
[NDC 2015] 레디스를 활용한 분산 게임 서버 구현 (0) | 2023.01.09 |
---|---|
[NDC 2015] 이 쿼리를 어떻게 짜야 잘 짰다고 소문이 날까? (0) | 2023.01.06 |
[NDC 2014] 데이터베이스에서 데드락이란 무엇인가? (사례 포함) (0) | 2022.12.25 |
[NDC 2014] 라이브 상황에서 윈도우 서버 개발자가 겪은 좌충우돌 Redis 적용 경험담 (0) | 2021.12.25 |
[NDC 2013] 게임속에서의 NoSQL 활용하기 (0) | 2021.12.01 |