ホームページ >バックエンド開発 >PHPチュートリアル >初心者カード発行時の重複防止方法と同様
ここで、多くの初心者カードのパスワードがデータ テーブルに事前に挿入されており、このサイトの各メンバーが自分でそれらを収集する必要があります。しかし、ここで問題が生じます。短期間に多くの人がこの初心者カードを受け取りに行く場合、同じことが繰り返されないようにカードをどのように設計するかです
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{
// 実行カードが使用され、処理されました
}