이 경우 앞서 본 트랜잭션 예처럼 데이터베이스에 변경을 가하다가 “뭔가 잘못되었으니 롤백하자!”라고 할 필요가 없습니다.
코드 게임 서버 메모리와 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}"); }