>  기사  >  PHP 프레임워크  >  laravel 독점 잠금 lockForUpdate() 사용 문제 분석

laravel 독점 잠금 lockForUpdate() 사용 문제 분석

藏色散人
藏色散人앞으로
2021-01-08 13:56:244097검색

mysql의 단독 잠금에 단독 효과가 있는지 테스트를 해봤습니다.

테스트 1: 명령줄에서 배타적 잠금 테스트

먼저 명령줄에서 테스트하고 두 개의 명령줄 열기
먼저 명령줄 1에서 배타적 잠금 추가:

그런 다음 명령줄 2에서 액세스 테스트 :


명령줄 1에서 커밋이 완료된 후 명령줄 2에서도 실행 결과가 실행되는 것을 확인할 수 있습니다.
그러므로 명령줄에서 배타적 잠금을 테스트하는 데에는 문제가 없습니다. laravel 排他锁 lockForUpdate() 使用问题

laravel 排他锁 lockForUpdate() 使用问题

테스트 2: laravel 컨트롤러 방법에서 배타적 잠금 테스트

laravel에서 배타적 잠금을 테스트해 보겠습니다.
두 경로:

Route::get('/locktest1','LockController@ LockTest1' );Route::get('/locktest2','LockController@LockTest2');LockTest1 및 컨트롤러 LockTest2의 code>이 두 가지 방법의 내용은 동일합니다.

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

먼저 /locktest1 경로에 접속하여 정상적으로 데이터를 출력해 보세요. 개인적으로 현재로서는 거래가 종료되지 않은 것으로 추측합니다. 데이터 테이블에 액세스하기 위한 또 다른 요청이므로 차단되어야 합니다.
여기서 /locktest2에 접속하면 데이터가 정상적으로 출력되는군요. 왜 차단 효과가 없나요?
Route::get('/locktest1','LockController@LockTest1');
Route::get('/locktest2','LockController@LockTest2');
控制器中的 LockTest1LockTest2这两个方法内容都一样:

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

先访问路由/locktest1,正常打印出数据,个人猜想此时事务没有关闭,如果再有访问数据表的请求,应该是阻塞的。
所以在此访问/locktest2,结果还是正常打印出数据,为什么没有产生阻塞效果呢?

测试3:laravel控制器方法与命令行混合测试排他锁

1、先在命令行里开启事务添加排他锁,同测试1里的命令行1的操作;
然后访问路由/locktest1,页面一直运行中,说明查询数据存在阻塞;
最后命令行里commit提交。
2、先访问路由/locktest1,正常打印出数据;
然后在命令行里开启事务添加排他锁,同测试1里的命令行1的操作,发现正常查询出数据,没有阻塞;说明laravel的控制器方法里的排他锁操作确实没有成功。

总结:为什么laravel的lockForUpdate()没有效果呢,还是说laravel控制器方法执行完毕后,会自动结束事务才导致没有阻塞效果的?

于是,再次做下面测试:
将路由1的控制器方法里加了一个sleep()方法:

rrreee

然后,访问路由1/locktest1,页面在等待刷新;再访问路由2/locktest2,页面也在等待刷新,说明应该是产生数据阻塞了,因为路由2中没有sleep(),正常情况下是立即执行的。
10秒过后,/locktest1页面打印出数据,同时/locktest2

테스트 3: Laravel 컨트롤러 방법 및 명령줄 혼합 테스트 독점 잠금

1 먼저 명령줄에서 트랜잭션을 열어 독점 잠금을 추가합니다. 테스트 1의 명령줄 1 작업과 동일합니다.

그런 다음 /locktest1 경로에 액세스하면 페이지가 실행 중이며 쿼리 데이터가 차단되었음을 나타냅니다.

마지막으로 명령줄에서 커밋합니다. 2. 먼저 /locktest1 경로에 액세스하여 데이터를 정상적으로 인쇄합니다. 그런 다음 명령줄에서 트랜잭션을 열어 배타적 잠금을 추가합니다. 데이터가 정상적으로 쿼리됩니다. 차단이 없다는 것은 Laravel의 컨트롤러 메서드에서 단독 잠금 작업이 성공하지 못했음을 의미합니다.

🎜🎜🎜🎜🎜요약: laravel의 lockForUpdate()가 효과가 없는 이유는 무엇입니까? ​​아니면 laravel 컨트롤러 메서드가 실행된 후 트랜잭션이 자동으로 종료되어 차단 효과가 없나요? 🎜🎜🎜다음 테스트를 다시 수행하세요. 🎜경로 1의 컨트롤러 메서드에 sleep() 메서드를 추가하세요. 🎜rrreee🎜그런 다음 경로 1/locktest1에 액세스하면 페이지가 대기 중입니다. 경로 2 /locktest2에 액세스할 때 페이지도 새로 고쳐지기를 기다리고 있으며 이는 경로 2에 sleep()이 없기 때문에 데이터가 차단되어야 함을 나타내며 다음에서 즉시 실행됩니다. 정상적인 상황. 🎜10초 후 /locktest1 페이지에서 데이터가 출력되고, /locktest2 페이지에서도 데이터가 출력됩니다. 🎜🎜🎜🎜 이를 통해 위 테스트 3에서는 컨트롤러 메소드 종료 후 트랜잭션 자동 종료로 인해 발생하는 차단 효과가 발생하지 않았습니다. 🎜🎜위 내용은 개인적인 분석입니다. 혹시 지나가시는 사부님 계시다면 메시지 남겨주시면 정답 알려드리겠습니다! 🎜🎜더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 교육🎜을 방문하세요! ! 🎜

위 내용은 laravel 독점 잠금 lockForUpdate() 사용 문제 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제