次のコラム #ララvelチュートリアルでは、laravel排他ロックlockForUpdate()の使い方を紹介します。困っている友達に役立つことを願っています。
mysqlの排他ロックについて、排他効果があるかどうかテストしてみました。テスト 1: コマンド ライン テストの排他的ロック
コマンド ラインで最初のテストを行い、2 つのコマンド ラインを開きます最初のコマンド ライン 1 でのテスト排他的ロックを追加します:
次に、コマンド ライン 2 でアクセスをテストします:
実際にブロックされていることがわかります。コマンド ライン 1 のコミットが終了すると、 command 2行目にも実行結果が表示されます。
したがって、コマンド ラインで排他ロックをテストしても問題はありません。
テスト 2: laravel コントローラー メソッドで排他的ロックをテストする
laravel で排他的ロックをテストしましょう:2 つのルート :
Route::get('/locktest1','LockController@LockTest1');
Route::get('/locktest2','LockController@LockTest2');コントローラー内の 2 つのメソッド
LockTest1と
LockTest2の内容は同じです。
最初にルート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
/locktest2 にアクセスすると、ページも更新を待機しています。これは、ルートに sleep() がないため、データがブロックされていることを示します。 2、通常はすぐに実行されます。
10 秒後、/locktest1
ページでデータが出力され、
/locktest2 ページでもデータが出力されます。
プログラミング教育
をご覧ください。 !以上がlaravel排他ロックlockForUpdate()の使用問題の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。