ホームページ >PHPフレームワーク >ThinkPHP >thinkphpでテーブルをロックする方法
最近、同時実行性がそれほど高くない登録システムを作成する必要がありますが、それでも複数の人が同時にサインアップする可能性があります。登録には順序が関係するため、行またはテーブルがロックされていない場合、次の状況が発生します:
例:
現在のシステムではユーザー A のみがサインアップしており、順序は 1 です。レコードは (A, 1);
ある時刻 t に、ユーザー B、ユーザー C、およびユーザー D が同時に登録されました。バックエンドは、ほぼ時刻 t に B、C、D の登録リクエストを受け取りました。同時に登録フォームにクエリを実行したところ、現在は (A, 1) のみであることが判明したため、登録フォームに (B, 2)、(C, 2)、(D, 2) を挿入して、結果:
(A, 1)
(B, 2)
(C, 2)
(D, 2)。
私が最初に考えたのは、「注文を記録するのではなく、挿入タイムスタンプを記録する。この場合、それは
(A, ta)
##」です。 #(B, tb) (C, tc)(D, td)。 ta、tb、tc、および td が等しいことはほとんど不可能です。 関連する推奨事項: 「ThinkPHP チュートリアル 」
ただし、これを実行しても解決できない問題が 3 つあります: 1. タイムスタンプが異なる可能性があります。等しい。確率は非常に低い; 2. 直感的ではないため、タイムスタンプで並べ替える必要がある; 3. 登録時に人数制限を使用する。登録を 40 名に制限し、現在の登録が登録されているかどうかをすぐにフィードバックします。$User->lock(true)->save($data);// 使用悲观锁功能ただし、ターゲット システムは一連の操作を実行する必要があるため、使用されるロック テーブル コードは次のとおりです:
M()->query("lock tables yourtable write"); // TODO // your code M()->query("unlock tables");実際のエフェクトは実行中です エフェクトは悪くありません [実際の日付は除外されています]:
??-??-?? 10:00:00 1 ??-??-?? 10:00:00 2 ??-??-?? 10:00:00 3 ??-??-?? 10:00:00 4 ??-??-?? 10:00:01 5 ??-??-?? 10:00:01 6 ??-??-?? 10:00:01 7 ??-??-?? 10:00:01 8 ??-??-?? 10:00:02 9 ??-??-?? 10:00:02 10 ??-??-?? 10:00:02 11 ??-??-?? 10:00:02 12 ??-??-?? 10:00:02 13 ??-??-?? 10:00:02 14 ??-??-?? 10:00:03 15 ??-??-?? 10:00:03 16 ??-??-?? 10:00:03 17 ??-??-?? 10:00:05 18 ??-??-?? 10:00:06 19 ??-??-?? 10:00:07 20 ??-??-?? 10:00:08 21 ??-??-?? 10:00:10 22 ??-??-?? 10:00:15 23 ??-??-?? 10:00:17 24 ??-??-?? 10:00:19 25 ??-??-?? 10:00:19 26 ??-??-?? 10:00:24 27 ??-??-?? 10:00:25 28 ??-??-?? 10:00:34 29 ??-??-?? 10:00:35 30 ??-??-?? 10:00:38 31 ??-??-?? 10:01:06 32 ??-??-?? 10:01:11 33 ??-??-?? 10:01:11 34 ??-??-?? 10:01:17 35 ??-??-?? 10:01:18 36 ??-??-?? 10:02:27 37 ??-??-?? 10:02:38 38 ??-??-?? 10:02:39 39 ??-??-?? 10:02:57 40
以上がthinkphpでテーブルをロックする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。