더북(TheBook)

이 경우 앞서 본 트랜잭션 예처럼 데이터베이스에 변경을 가하다가 “뭔가 잘못되었으니 롤백하자!”라고 할 필요가 없습니다.

코드 게임 서버 메모리와 DB에서 두 플레이어 간 아이템 교환

// 플레이어 1, 2가 각자 가진 아이템 1, 2를 교환한다.
void RequestExchangeItems(player1, player2, item1, item2)
{
    // 각 플레이어는 아이템을 맞게 갖고 있는가?
    if (!player1.hasItem(item1))
    {
        // 실패를 클라이언트들에 알린다.
        ResponseExchangeItemsFail(...);
        return;
    }
    if (!player2.hasItem(item2))
    {
        // 실패를 클라이언트들에 알린다.
        ResponseExchangeItemsFail(...);
        return;
    }
    ...; // 기타 필요한 검사를 더 수행한다.
 
    // 아이템을 주고받을 수 있게 되었다. 서버 메모리에 있는 데이터를 변경한다.
    player1.removeItem(item1);
    player2.removeItem(item2);
    player1.addItem(item2);
    player2.addItem(item1);
 
    // 데이터베이스에 변경을 가한다.
    // 데이터베이스 입장에서는 제거 & 추가가 아니라 그냥 소유자만 변경한다.
    // 이미 게임 서버 메모리에서 검증을 마쳤으므로 트랜잭션을 할 필요가 없다.
    db.execute("update Item set owner={player2} where itemID={item1}");
    db.execute("update Item set owner={player1} where itemID={item2}");
}

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