Home >PHP Framework >Laravel >Analysis of laravel exclusive lock lockForUpdate() usage issues

Analysis of laravel exclusive lock lockForUpdate() usage issues

藏色散人
藏色散人forward
2021-01-08 13:56:244139browse

The following column Laravel Tutorial will introduce to you the use of laravel exclusive lock lockForUpdate(), I hope it will be helpful to friends in need!

For mysql's exclusive lock, I did a test to see if there is an exclusive effect.

Test 1: Command line test exclusive lock

First test in the command line, open two command lines
First test in the command line 1 Add an exclusive lock:
laravel 排他锁 lockForUpdate() 使用问题
Then test access in command line 2:
laravel 排他锁 lockForUpdate() 使用问题
You can see that it is indeed blocked. After the commit in command line 1 ends, the command The execution result is also shown in line 2.
So, there is no problem in testing the exclusive lock in the command line.

Test 2: Test the exclusive lock in laravel controller method

Let’s test the exclusive lock in laravel:
Two routes :
Route::get('/locktest1','LockController@LockTest1');
Route::get('/locktest2','LockController@LockTest2');
The contents of the two methods LockTest1 and LockTest2 in the controller are the same:

DB::beginTransaction(); // 开启事务
$goods = Goods::lockForUpdate()->first();
print_r($goods);

First access the route/locktest1, print out the data normally. I personally guess that the transaction is not closed at this time. If there is another request to access the data table, it should be blocked.
So when I visit /locktest2 here, the result is that the data is printed out normally. Why is there no blocking effect?

Test 3: Laravel controller method and command line mixed test exclusive lock

1. First open the transaction in the command line to add an exclusive lock , the same as the operation of command line 1 in test 1;
Then access the route /locktest1, the page is always running, indicating that the query data is blocked;
Finally commit in the command line.
2. First visit the route /locktest1, and print out the data normally;
Then open the transaction in the command line to add an exclusive lock, the same operation as the command line 1 in test 1, and find the normal query Data is output without blocking; it means that the exclusive lock operation in laravel's controller method did not succeed.

Summary: Why does laravel's lockForUpdate() have no effect? ​​Or is it that after the laravel controller method is executed, the transaction will automatically end, resulting in no blocking effect? ?

So, do the following test again:
Add a sleep() method to the controller method of route 1:

DB::beginTransaction(); // 开启事务
$goods = Goods::lockForUpdate()->first();
print_r($goods);sleep(10);echo 'ddd';

Then, access route 1/ locktest1, the page is waiting to be refreshed; when accessing route 2/locktest2, the page is also waiting to be refreshed, indicating that data is blocked, because there is no sleep() in route 2, normally it is Executed immediately.
After 10 seconds, the /locktest1 page prints out the data, and the /locktest2 page also prints out the data.

Judging from this, the above test 3 did not produce a blocking effect, which should be caused by the automatic end of the transaction after the controller method ends.

The above is a personal analysis. If there is a master who passes by, please leave a message and tell me the correct answer!

For more programming-related knowledge, please visit: Programming Teaching! !

The above is the detailed content of Analysis of laravel exclusive lock lockForUpdate() usage issues. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:learnku.com. If there is any infringement, please contact admin@php.cn delete