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:
Then test access in command line 2:
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 methodsLockTest1
andLockTest2
in the controller are the same:DB::beginTransaction(); // 开启事务 $goods = Goods::lockForUpdate()->first(); print_r($goods);Copy after loginFirst 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.
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!