ホームページ >PHPフレームワーク >Laravel >laravel排他ロックlockForUpdate()の使用問題の分析

laravel排他ロックlockForUpdate()の使用問題の分析

藏色散人
藏色散人転載
2021-01-08 13:56:244137ブラウズ

次のコラム #ララvelチュートリアルでは、laravel排他ロックlockForUpdate()の使い方を紹介します。困っている友達に役立つことを願っています。

mysqlの排他ロックについて、排他効果があるかどうかテストしてみました。

テスト 1: コマンド ライン テストの排他的ロック

コマンド ラインで最初のテストを行い、2 つのコマンド ラインを開きます

最初のコマンド ライン 1 でのテスト排他的ロックを追加します:

laravel 排他锁 lockForUpdate() 使用问题 次に、コマンド ライン 2 でアクセスをテストします:

laravel 排他锁 lockForUpdate() 使用问题 実際にブロックされていることがわかります。コマンド ライン 1 のコミットが終了すると、 command 2行目にも実行結果が表示されます。
したがって、コマンド ラインで排他ロックをテストしても問題はありません。

テスト 2: laravel コントローラー メソッドで排他的ロックをテストする

laravel で排他的ロックをテストしましょう:

2 つのルート :

Route::get('/locktest1','LockController@LockTest1');
Route::get('/locktest2','LockController@LockTest2'); コントローラー内の 2 つのメソッド
LockTest1LockTest2 の内容は同じです。

DB::beginTransaction(); // 开启事务
$goods = Goods::lockForUpdate()->first();
print_r($goods);
最初にルート

/locktest1## にアクセスします。 #, 通常どおりデータを出力します。個人的には、この時点ではトランザクションがクローズされていないと思います。データ テーブルへの別のアクセス要求がある場合は、ブロックされるはずです。 そこで、ここで /locktest2
にアクセスすると、データは正常に出力されますが、なぜブロック効果がないのでしょうか?

テスト 3: Laravel コントローラー メソッドとコマンド ラインの混合テスト排他的ロック1. まず、コマンド ラインでトランザクションを開いて、排他ロック、テスト 1 のコマンド ライン 1 の操作と同じ;

次に、ルート

/locktest1
にアクセスします。ページは常に実行されており、クエリ データがブロックされていることを示します。コマンドラインでコミットします。 2. まずルート /locktest1
にアクセスし、通常どおりデータを出力します。
次に、コマンド ラインでトランザクションを開いて排他ロックを追加します (コマンド ライン 1 と同じ操作)。テスト1で通常のクエリを見つけるとデータはブロックされずに出力されますが、これはlaravelのコントローラーメソッドでの排他ロック操作が成功しなかったことを意味します。

要約: laravel の lockForUpdate() はなぜ効果がないのですか? それとも、laravel コントローラーのメソッドが実行された後、トランザクションが自動的に終了するためですか?結果としてブロッキング効果はありませんか?

そこで、次のテストを再度実行します。

ルート 1 のコントローラー メソッドに sleep() メソッドを追加します。
DB::beginTransaction(); // 开启事务
$goods = Goods::lockForUpdate()->first();
print_r($goods);sleep(10);echo 'ddd';

次に、ルート 1
/ にアクセスします。 locktest1

、ページは更新を待機しています。ルート 2

/locktest2 にアクセスすると、ページも更新を待機しています。これは、ルートに sleep() がないため、データがブロックされていることを示します。 2、通常はすぐに実行されます。 10 秒後、/locktest1 ページでデータが出力され、
/locktest2 ページでもデータが出力されます。

このことから判断すると、上記のテスト 3 ではブロッキング効果は発生しませんでした。これは、コントローラー メソッドの終了後にトランザクションが自動的に終了することによって引き起こされるはずです。

上記は個人的な分析ですので、通りすがりのマスターがいらっしゃいましたらメッセージを残して正解を教えてください!

プログラミング関連の知識について詳しくは、

プログラミング教育

をご覧ください。 !

以上がlaravel排他ロックlockForUpdate()の使用問題の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。