2

私はウェブ用の戦略的なマルチユーザー ゲームを書いています。これには、進行中のゲームごとに 1 行ずつ、シリアル化して MySQL (innodb) データベースの BLOB に保存する予定のプレイフィールド (X x Y の正方形) があります。

私は現在、プレイフィールドに変更があった場合にデータベースを最新の状態に保つための良い方法を見つけようとしていますが、同時に、ページをロードしてから実際にプレイフィールドに起こることを処理する方法の便利な解決策を見つけようとしています。行動を起こす。
私はAJAXを使用していません。

各ゲームには最大 20 人のプレイヤーが参加し、各プレイヤーは 24 時間で 1 ~ 10 回の移動を行うため、「遅い」ゲームです。

私の計画 (これまでのところ) は、プレイフィールドのチェックサムのようなものをブロブの隣に保存し、プレイフィールドに変更を加える前に、データベースの状態とロードされた状態を比較することです。

私が心配しているのは、競合状態を防ぐ方法です。
それは十分ですか:

  1. 取引開始。
  2. テーブルからプレイフィールドを読み込む
  3. チェックサムが異なる場合 - ロールバックしてユーザー ビューを更新する
  4. チェックサムが変更されていない場合 - テーブルを更新し、変更をコミットします

レースをブロックするにはBEGIN TRANSACTION十分ですか、それともテーブルを更新する意図を示すためにステップ 2 でさらに何かをする必要がありますか?

すべてのアドバイスに感謝します。

4

2 に答える 2

2

データベースからプレイフィールドをロードするときにSELECT ... FOR UPDATEを使用すると、トランザクションをコミットまたはロールバックするまで、他の選択がブロックされます。

于 2010-08-24T16:36:10.593 に答える
0

いいえ。競合する更新から保護する必要があるテーブルに対して、LOCK TABLES コマンドを発行する必要があります。これは次のようになります...

LOCK TABLE my_table WRITE;

詳細については、こちらを参照してください... http://dev.mysql.com/doc/refman/5.1/en/lock-tables.html

後でアンロックすることを忘れないでください!

于 2010-08-24T15:15:44.477 に答える