더북(TheBook)

따라서 데이터베이스 트랜잭션을 할 때는 꼭 필요한 최소한의 구간에서만 하는 것이 좋습니다. 트랜잭션의 영향을 받는 레코드는 최소 개수로 하고, 트랜잭션을 시작부터 끝날 때까지 데이터를 액세스하는 횟수 역시 최소로 하는 것입니다.

그리고 교착 상태로 질의 구문 실행이 매우 오랫동안 블로킹되거나 실패를 출력할 때도 반드시 별도로 처리해 주어야 합니다. 데드락으로 수십초 블로킹을 하면 타임아웃 오류가 발생합니다. 예를 들어 데이터베이스 질의 구문을 실행한 곳에서는 타임아웃 오류가 발생했을 때 질의 구문을 다시 실행한다든지 하는 방법으로 오류를 핸들링 처리하면 됩니다.

트랜잭션이 관여되는 레코드는 다른 질의 구문 프로세스에서 액세스할 경우 블로킹을 일으켜 병렬 처리 효율성이 떨어집니다. 불행하게도 트랜잭션 관련 레코드만 잠금되는 것이 아니라, 그 레코드 주변에 있는 다른 레코드 및 해당 레코드가 있는 테이블 전체가 잠금되기도 합니다. 따라서 여러분이 예상하는 것보다 더 넓은 범위가 잠금되기도 합니다.

실시간 멀티플레이 온라인 게임에서 플레이어 정보는 자주 변경됩니다. 몬스터 하나를 잡을 때마다 변경될 테니까요. 이러한 상황에서 트랜잭션은 심각한 문제를 일으킬 수 있습니다.

그러나 너무 걱정할 필요는 없습니다. 게임 서버는 플레이어 정보를 메모리에 보관하고, 플레이어의 데이터를 게임 서버 안에 있는 메모리에서 변경하며, 변경된 내용을 데이터베이스에 저장합니다. 즉, 데이터베이스를 세이브 데이터처럼 사용하는 셈이죠.

게임 서버 안 메모리가 연산의 주요 대상이므로 두 플레이어 간 아이템 거래 같은 중요한 처리도 게임 서버 안 메모리에서 모두 판정이 끝난 후 뒤늦게 데이터베이스에 기록됩니다(다음 코드 예시 참고).

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.