mysqlでは一度に1つのオープンエントリのみを許可します

ベルギンフィッシュ

私はajaxを介してphpとjqueryで動作するゲームを開発しました。

基本的に、サーバーにリクエストが行われると、まだ開いているゲームがない場合、サーバーは新しいゲームを作成します。ゲームのデータベーステーブルは次のようになります。

id | closed | time

ゲームが終了すると、closedは1に設定され、timeはゲームが作成されたときのUNIXタイムスタンプです。

ここで重要なことは、テーブルには常にclosed = 0のゲームが1つしか存在できないということです。

これを行うために、私は次のphpコードを使用しています

$query = "SELECT id FROM games WHERE closed = '0' LIMIT 1";
$result = $this->database->query($query);
if ($result->num_rows == 0) {
    $query = "INSERT INTO games_roulette SET time = '".time()."'";
    $result = $this->database->query($query);
    return $this->database->insert_id;
} else {
    return false;
}

たまに2つのゲームが作成されることもあります。2つのゲームが開いているときは時間の値が常にまったく同じであるため、2つのリクエストがまったく同時に送信されるためだと思います。

テーブルにclosed = 0のゲームが2つ存在しないことを、100%確実にできる方法はありますか?

Unix One

あなたが2つのレコードで終わる可能性のある理由は、あなたが疑うように、並行性です。2つのプロセスがSELECT最初に別々にクエリを実行する場合、両方が青信号を取得して続行し、両方がを実行しINSERTます。したがって、そのような行は2つ(またはそれ以上!)になります。

従来は、これを回避するためにトランザクションまたはロックを使用していましたが、単一のアトミッククエリでこれを実行できるSQLの「トリック」もあります。

INSERT INTO 
  game_roulette 
SELECT NULL、x.closed、NOW()
  FROM 
    (SELECT '0' as 
    close )x LEFT JOIN game_roulette g ON x.closed = g.closed 
  WHERE 
    g.id IS NULL

それはです:ちょうどこれがどのように動作するかを説明するためINSERT ... SELECTの構文、SELECT何行がない場合、クエリは結果だけを得game_roulette.closedているが'0'次に、これは、単一の行テーブルを作成しx、次にonLEFT JOINに対して実行し、制約を使用することによって実行されます。game_rouletteclosedg.id IS NULL

このクエリの完了後、必要に応じて、アプリケーションは、他の場合と同様に、の結果をチェックして、結果INSERTとして行が挿入されたかどうかを知ることができます。

注:大きなテーブルでこれを行う場合は、クエリのパフォーマンスを測定するか、closed列にインデックスがあり、それが使用されていることを確認する必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

incronジョブで一度に1つのエントリを許可しますか?

分類Dev

datastax cassandraオブジェクトマッパーは、一度に1つのエンティティのみを読み取ることができます

分類Dev

NodeJSで一度に1つのデバイスからのサインインのみを許可する

分類Dev

bsmultiselectdivで一度に1つのオプションを選択します

分類Dev

Azure Function Service Busトリガー:イベントストリームからのデータのバッチを停止し、一度に1つのメッセージのみをキューから許可する方法は?

分類Dev

Highcharts NGは、一度に1つのポイントのみを表示します。アニメーション

分類Dev

ASIOドライバーは一度に1つのアプリケーションのみをサポートします

分類Dev

ブートストラップ-特定のセクションでのみ一度に1つの折りたたみのみを表示します

分類Dev

オブジェクトの使用を一度に1つのスレッドのみに許可する

分類Dev

Ngx Bootstrap Popoverは、一度に1つのポップオーバーのみを表示します

分類Dev

Jqueryトリガーは、一度にaddEventListenerで指定された1つのイベントに対してのみ機能します

分類Dev

1つのステートメントで一度に複数のエントリをHashMapに追加する

分類Dev

一度に1つのズーム画像を許可する

分類Dev

mysqlで一度に1つの列の複数のランダムエントリを更新するにはどうすればよいですか?

分類Dev

一度に1つのドロップダウンメニューのみを表示します

分類Dev

一度に1つのメニューのみをドロップダウンします

分類Dev

一度にdatagridviewで2つの重複する値のみを許可しますC#?

分類Dev

一度に1つのモジュールのみを条件付きでコンパイルします

分類Dev

オプションで、必要な場合にのみ、データを一度に選択的に保存します

分類Dev

Spring REST Webサービスへのセッションを一度に1つだけ許可するにはどうすればよいですか?

分類Dev

DelphiCOMサーバーは一度に1つのリクエストを処理します

分類Dev

同じクラスで同じ入力をオートコンプリートするが、一度に1つの入力のみをオートコンプリートする方法

分類Dev

正規表現は文字のみを許可し、1つのスペースのみのオプションを許可します

分類Dev

Tkinterエントリボックス、一度に1つの文字列を入力して表示することはできません

分類Dev

ページをリロードし、Laravel 6.0のラジオボタンの1つをチェックしなかったときに、一度に1つのフォームのみを表示するにはどうすればよいですか?

分類Dev

一度に1つの非同期操作のみを許可する

分類Dev

Retrofit&OkHttp-一度に1つのリクエストのみを送信することは可能ですか?

分類Dev

チェックリストで一度に1つのチェックボックスのみを許可するようにする

分類Dev

C# オブジェクトのすべてのブール プロパティを一度にクエリして、一致するものを 1 つ探すことはできますか?

Related 関連記事

  1. 1

    incronジョブで一度に1つのエントリを許可しますか?

  2. 2

    datastax cassandraオブジェクトマッパーは、一度に1つのエンティティのみを読み取ることができます

  3. 3

    NodeJSで一度に1つのデバイスからのサインインのみを許可する

  4. 4

    bsmultiselectdivで一度に1つのオプションを選択します

  5. 5

    Azure Function Service Busトリガー:イベントストリームからのデータのバッチを停止し、一度に1つのメッセージのみをキューから許可する方法は?

  6. 6

    Highcharts NGは、一度に1つのポイントのみを表示します。アニメーション

  7. 7

    ASIOドライバーは一度に1つのアプリケーションのみをサポートします

  8. 8

    ブートストラップ-特定のセクションでのみ一度に1つの折りたたみのみを表示します

  9. 9

    オブジェクトの使用を一度に1つのスレッドのみに許可する

  10. 10

    Ngx Bootstrap Popoverは、一度に1つのポップオーバーのみを表示します

  11. 11

    Jqueryトリガーは、一度にaddEventListenerで指定された1つのイベントに対してのみ機能します

  12. 12

    1つのステートメントで一度に複数のエントリをHashMapに追加する

  13. 13

    一度に1つのズーム画像を許可する

  14. 14

    mysqlで一度に1つの列の複数のランダムエントリを更新するにはどうすればよいですか?

  15. 15

    一度に1つのドロップダウンメニューのみを表示します

  16. 16

    一度に1つのメニューのみをドロップダウンします

  17. 17

    一度にdatagridviewで2つの重複する値のみを許可しますC#?

  18. 18

    一度に1つのモジュールのみを条件付きでコンパイルします

  19. 19

    オプションで、必要な場合にのみ、データを一度に選択的に保存します

  20. 20

    Spring REST Webサービスへのセッションを一度に1つだけ許可するにはどうすればよいですか?

  21. 21

    DelphiCOMサーバーは一度に1つのリクエストを処理します

  22. 22

    同じクラスで同じ入力をオートコンプリートするが、一度に1つの入力のみをオートコンプリートする方法

  23. 23

    正規表現は文字のみを許可し、1つのスペースのみのオプションを許可します

  24. 24

    Tkinterエントリボックス、一度に1つの文字列を入力して表示することはできません

  25. 25

    ページをリロードし、Laravel 6.0のラジオボタンの1つをチェックしなかったときに、一度に1つのフォームのみを表示するにはどうすればよいですか?

  26. 26

    一度に1つの非同期操作のみを許可する

  27. 27

    Retrofit&OkHttp-一度に1つのリクエストのみを送信することは可能ですか?

  28. 28

    チェックリストで一度に1つのチェックボックスのみを許可するようにする

  29. 29

    C# オブジェクトのすべてのブール プロパティを一度にクエリして、一致するものを 1 つ探すことはできますか?

ホットタグ

アーカイブ