ホームページ >PHPフレームワーク >ThinkPHP >thinkphpでテーブルをロックする方法

thinkphpでテーブルをロックする方法

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼オリジナル
2019-08-22 11:33:274751ブラウズ

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 名に制限し、現在の登録が登録されているかどうかをすぐにフィードバックします。


現在の解決策は、データベースのロックによって解決することです。

オンラインでさまざまな情報を調べたところ、ThinkPHP では悲観的ロックと楽観的ロックを追加できることがわかりました。ターゲット システムのアクセス量は少ないため、悲観的ロックを使用してください。

MyISAM はテーブルのみをロックできますが、InnoDB は行をロックできます。ターゲット システム上のテーブルをロックするだけです。

公式ドキュメントで指定されているロック テーブル スキームは次のとおりです:

$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 サイトの他の関連記事を参照してください。

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