20. HitTask() { BeginTransaction(); A = GetForRead(); B = GetForUpdate(); B.Hp -= A.Att; Commit(); } * 태스크의 예 트랜잭션을 시작한다 . A 에 대해 읽기 락을 건다 . 이제 A 에 대해서 쓰기락을 걸 수 없다 . B 에 대해 쓰기 락을 건다 . 이제 B 에 대해서 읽기 / 쓰기 락을 걸 수 없다 . 실제 B 데이터를 수정한다 . 트랜잭션을 커밋한다 . B 의 변경점을 적용하고 A 와 B 의 락킹을 푼다 .
25. 데이터를 관리한다 . 내부에는 버클리 DB 를 사용하고 있다 . 트랜잭션 , 데이터 체크아웃 , 체크인 기능을 제공한다 . 응용프로그램 동작을 정의한다 . 단순한 광부 AI 를 제작하여 동작하도록 구현하였다 . (*Programming game AI by example 2 장 ) 네트워크를 담당한다 . 데모버전에서는 실제 네트워크를 구현하지 않고 mock 객체로 구현하였다 . TBB 를 사용하여 태스크 스케쥴러를 작성하였다 . 딜레이 태스크 , 반복 태스크등을 지원한다 .
26. 네트워크 패킷 태스크 매니져 BeginTransacton 세션 핸들러 OnRecv() Commit 1. 클라이언트로부터 메시지를 수신 2. 태스크 매니져에 메시지 처리 태스크를 추가한다 . 3. 태스크 시작에 트랜잭션을 시작한다 . 4. 실제 메시지를 처리한다 . 이 과정에서 객체 상태 가 변화한다 . 5. 태스크 마지막에 커밋하여 변경점을 적용한다 .
28. // 광부를 만든다 . ServerMiner miner; m_minerRef = g_DataManager::Instance().CreateReference(&miner); 광부 객체를 DataManager 를 통해서 메모리 DB 에 쓰고 그 참조객체를 반환한다 . 앞으로 생성한 광부를 객체를 접근하기 위해서 참조객체를 사용하게 된다 . Task() { ServerMiner* pMiner = m_minerRef.GetForUpdate(); if (pMiner != NULL) { pMiner->receivedMessage(_msg); } } 광부를 쓰기 권한을 읽는다 . 메시지를 처리함으로써 광부 상태가 변경된다 . 태스크 종료시 변경점이 자동으로 Commit 된다 . 또한 데드락 발생시 RollBack 된 뒤 태스크가 일정 횟수까지 재실행 된다 .