私は以下のような状況に陥っています:
私は、複数のユーザーが見たアイテムのリストを持っています。各アイテムは、各アイテムの右側にある「取得」ボタンをクリックして、私は項目の状態(取得された項目テーブルのブール値:true/false)をチェックすれば、複数のユーザーが項目を取得できないことを確認できますか?またはphp/mysqlでそれを行うための実用的な方法はありますか? Cordially、 Youssef。PHP/MYSQLの並行処理
答えて
アイテムのステータス(取得されたアイテムテーブルのブール値:true/false)をチェックすれば、複数のユーザーがアイテムを取得できないことがありますか?
どのように使用するかによって異なります。あなたのコードは、この線に沿って何かしている場合:
if (current status of item is "free") {
update status of item to "taken";
}
を別のプロセスがでスリップし、アイテムを取ることができる「チェック」や「更新」の間に隙間がありますので、それはは、に動作しません。それ自身のために!
UPDATE items SET claimed_by = :current_user
WHERE item_id = :id AND claimed_by IS NULL
このクエリは、すでに主張だアイテムを更新することを拒否し、次のことが確認できます。あなたがアイテムを主張しているユーザーを示すために列を持っている場合は、このSQLクエリの線に沿って何かがうまくいきます続行する前にそれを持っていることを確認する項目のclaimed_by
。
純粋なPHPでは、PHPページ自体はオンザフライで更新できません。
ただし、AJAXを使用することはできます。実用的かどうかは、チェックしたい項目の数に依存するため、別の話です。その場合でも、サーバーの速度、ユーザーの接続速度などによって変化する遅延が常に存在します。
ユーザーが取得を押すと「確認」などのメッセージを表示するのが最善の策です。小切手はAJAXを使って行います。先着順であれば誰でも最初に商品を手に入れます。
あなたの次のステップはAJAX(Javascript)を検索することです。
代替品は、アイテムがまだ利用可能かどうかを確認するために全面リロードを行い、これが起こることを事前に免責事項として表示することです。このアプローチは、ページ全体のリロードのためにAJAXを使用するよりも時間がかかります。
ありがとうございました。ユーザーの画面からアイテムが消えないようにしたいのですが、2人のユーザーが同時に取得をクリックした場合、1つしかアイテムを取得できません。 – hereForLearing
@saywowそしてAJAXは道のりです。 –
Ajaxは私の問題の解決策ではありません。コメントで説明したように、問題は利用できないアイテムを隠すことではなく、2人のユーザーが同じアイテムを同時に取得したい場合です。同じ時間取得両方のアイテムを取得できるかどうかをチェックします。この場合、回答は「はい」になりますので、両方とも取得します(データベースでは1対多の関係であるためエラーが発生します)。エラーを避ける – hereForLearing
- 1. Entity Frameworkの並行処理の処理
- 2. Rustの並行処理ツリー
- 3. メッセージの並行処理
- 4. 並行タスクの処理
- 5. RailsのResque並行処理
- 6. JRubyでの並行処理
- 7. 並行処理と並列処理 - 具体的にはC++で
- 8. Drools並行処理ドロオ5.5.0
- 9. 並行処理でRvalue refs
- 10. Android SharedPreferences並行処理
- 11. 並行処理がVertx
- 12. ReactiveUIコマンド並行処理(WebClient)
- 13. 並行処理を理解する
- 14. 並行処理を処理するPHPのページキャッシュ?
- 15. AlfrescoはJavaScriptを/ Rhinoのマルチスレッド処理と並行処理
- 16. django querysetのメソッドと並行処理を処理するには?
- 17. データベースの並行処理の仕組み
- 18. Android SQLiteの並行処理の問題
- 19. MVVMアプリケーションの並行処理アーキテクチャ
- 20. MSMQ並行処理設計の問題
- 21. BeginWaitForConnectionとGeneric.Listの並行処理
- 22. UWPアプリケーション用の並行処理ビジュアライザ
- 23. Laravelの並行処理について
- 24. 複数の並行処理Lua
- 25. データの並行処理方法は?
- 26. 並行処理は並列処理ではありませんか?
- 27. カフカ:同期処理の並列処理
- 28. スパークストリーミング処理の並列処理
- 29. 命令レベルの並列処理と並列処理の違い
- 30. JEE6 @ApplicationScoped Beanと並行処理
問題は、更新する必要があり、いくつかの挿入クエリを実行する必要があります。更新が行われたかどうかを確認するために更新を取得できますか?この回答に基づいて、私は挿入クエリを行うかどうかを決定します。これは100%働くでしょうか? 2人のユーザーがUpdateクエリを同じ時間に実行すると、どういう意味ですか? (可能でしょうか?^^ ') – hereForLearing
UPDATEクエリで更新された行の数を調べるか、またはSELECTを実行して新しい値のclaim_byを調べることができます。並列性に関して:データベースサーバはクエリを直列化します。これらのクエリのどれだけが同時に実行されても、それらのうちの1つだけが 'claimed_by'の値を更新し、残りは何も行いません。 – duskwuff
ありがとう、私はあなたの答えを受け入れました。 – hereForLearing