2


1

これで十分ですか、それとも競合状態になりますか?

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

私は今、プレイフィールドへの変更でデータベースを最新の状態に保つ良い方法を見つけようとすると同時に、ページをロードしてから実際に動きます。 +私はAJAXを使用しません。

各ゲームには最大で20人のプレイヤーがいて、各プレイヤーは24時間で1〜10の動きをするため、「スロー」ゲームです。

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

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

  1. トランザクションを開始します。

  2. テーブルからプレイフィールドをロード

  3. チェックサムが異なる場合-ユーザービューをロールバックして更新する

  4. チェックサムが変更されていない場合-テーブルを更新し、変更をコミットする

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

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

2 Answer


2


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


0


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

LOCK TABLE my_table WRITE;

詳細はこちらをご覧ください…​ http://dev.mysql.com/doc/refman/5.1/en/lock-tables.html

後でそれらのロックを解除することを忘れないでください!