ホームページ >バックエンド開発 >PHPチュートリアル >初心者カード発行時の重複防止方法と同様

初心者カード発行時の重複防止方法と同様

WBOY
WBOYオリジナル
2016-06-23 14:01:231198ブラウズ

ここで、多くの初心者カードのパスワードがデータ テーブルに事前に挿入されており、このサイトの各メンバーが自分でそれらを収集する必要があります。しかし、ここで問題が生じます。短期間に多くの人がこの初心者カードを受け取りに行く場合、同じことが繰り返されないようにカードをどのように設計するかです


ディスカッションへの返信 (解決策)

1.カードはランダムに配布され、最後に別のフィールドを追加し、デフォルトで 1 とマークされ、受け取った後は 0 とマークされます
2. 良い方法は、設計中にステップ サイズ 1 で自動的に増加するフィールド ID を追加し、TMP を追加することです。デフォルト値は 0 のフィールドです
TMP は誰かが受け取るたびに増加します 1. ID = TMP のときに収集が完了します

1. ランダムに発行される場合は、カードの後に​​フィールドを追加します。デフォルトは 1 とマークされています。収集後、0 とマークされます
2. 設計時にステップ サイズ 1 の自動フィールドを追加し、TMP フィールドを追加することをお勧めします。デフォルトは 0 です
誰かがそれを受け取るたびに、TMP が追加されます。 ID = TMP の場合、回収は完了しますが、非常に短期間に複数人が同時に回収を申請した場合、初心者カードは前の人によって回収されますか?彼にはマークフィールドを変更する時間があり、次の人が再びやって来て、初心者カードは別の人に割り当てられました

この問題は同時実行性に関するもので、解決策はロック、SQLです。行レベルのロックを追加するだけです。以前に同様のことを行いました。これにはロックが必要です。コード内で関数をロックできます。同様のデータベースのロックに関する情報を確認できます。

コードを記述するときは、まずステップ サイズに 1 を加えてから、現在のステップ サイズから 1 を引いた値を抽出できます。この方法では、時間は同じで、1 人だけがカードを取得できます。残りの人が表示されますので、後でもう一度試してください

、楽観的ロックと悲観的ロックの方法を参照してください

初心者なので、抜け穴があるかもしれません。ロジック.. 彼らが言っている名詞を確認する方が確実です~

カードが使用されたかどうかを記録するフィールドを使用し、mysql の更新ロック テーブルを使用して同時実行の問題を解決します。

たとえば、テーブル構造は次のようになります。
id Cardno Cardpass used
$sqlstr = "update table set used=1 where used=0 and Cardno=xxxx";
mysql_query($sqlstr);
$affected_rows = mysql_affected_rows() ;
if ($affected_rows==1){ // 変更が成功したことを示します
// 実行と使用が正常に処理されました
}else{
// 実行カードが使用され、処理されました
}

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。