2017-07-03 26 views
0

私は以下のような状況に陥っています:
私は、複数のユーザーが見たアイテムのリストを持っています。各アイテムは、各アイテムの右側にある「取得」ボタンをクリックして、私は項目の状態(取得された項目テーブルのブール値:true/false)をチェックすれば、複数のユーザーが項目を取得できないことを確認できますか?またはphp/mysqlでそれを行うための実用的な方法はありますか? Cordially、 Youssef。PHP/MYSQLの並行処理

答えて

1

アイテムのステータス(取得されたアイテムテーブルのブール値: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

+0

問題は、更新する必要があり、いくつかの挿入クエリを実行する必要があります。更新が行われたかどうかを確認するために更新を取得できますか?この回答に基づいて、私は挿入クエリを行うかどうかを決定します。これは100%働くでしょうか? 2人のユーザーがUpdateクエリを同じ時間に実行すると、どういう意味ですか? (可能でしょうか?^^ ') – hereForLearing

+0

UPDATEクエリで更新された行の数を調べるか、またはSELECTを実行して新しい値のclaim_byを調べることができます。並列性に関して:データベースサーバはクエリを直列化します。これらのクエリのどれだけが同時に実行されても、それらのうちの1つだけが 'claimed_by'の値を更新し、残りは何も行いません。 – duskwuff

+0

ありがとう、私はあなたの答えを受け入れました。 – hereForLearing

2

純粋なPHPでは、PHPページ自体はオンザフライで更新できません。

ただし、AJAXを使用することはできます。実用的かどうかは、チェックしたい項目の数に依存するため、別の話です。その場合でも、サーバーの速度、ユーザーの接続速度などによって変化する遅延が常に存在します。

ユーザーが取得を押すと「確認」などのメッセージを表示するのが最善の策です。小切手はAJAXを使って行います。先着順であれば誰でも最初に商品を手に入れます。

あなたの次のステップはAJAX(Javascript)を検索することです。

代替品は、アイテムがまだ利用可能かどうかを確認するために全面リロードを行い、これが起こることを事前に免責事項として表示することです。このアプローチは、ページ全体のリロードのためにAJAXを使用するよりも時間がかかります。

+1

ありがとうございました。ユーザーの画面からアイテムが消えないようにしたいのですが、2人のユーザーが同時に取得をクリックした場合、1つしかアイテムを取得できません。 – hereForLearing

+2

@saywowそしてAJAXは道のりです。 –

+0

Ajaxは私の問題の解決策ではありません。コメントで説明したように、問題は利用できないアイテムを隠すことではなく、2人のユーザーが同じアイテムを同時に取得したい場合です。同じ時間取得両方のアイテムを取得できるかどうかをチェックします。この場合、回答は「はい」になりますので、両方とも取得します(データベースでは1対多の関係であるためエラーが発生します)。エラーを避ける – hereForLearing