mysql의 단독 잠금에 단독 효과가 있는지 테스트를 해봤습니다.
테스트 1: 명령줄에서 배타적 잠금 테스트먼저 명령줄에서 테스트하고 두 개의 명령줄 열기먼저 명령줄 1에서 배타적 잠금 추가:laravel에서 배타적 잠금을 테스트해 보겠습니다.그런 다음 명령줄 2에서 액세스 테스트 :
명령줄 1에서 커밋이 완료된 후 명령줄 2에서도 실행 결과가 실행되는 것을 확인할 수 있습니다.
그러므로 명령줄에서 배타적 잠금을 테스트하는 데에는 문제가 없습니다.
테스트 2: 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');
控制器中的LockTest1
和LockTest2
这两个方法内容都一样: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()方法:
然后,访问路由1/locktest1
,页面在等待刷新;再访问路由2/locktest2
,页面也在等待刷新,说明应该是产生数据阻塞了,因为路由2中没有sleep(),正常情况下是立即执行的。
10秒过后,/locktest1
页面打印出数据,同时/locktest2
1 먼저 명령줄에서 트랜잭션을 열어 독점 잠금을 추가합니다. 테스트 1의 명령줄 1 작업과 동일합니다.
그런 다음/locktest1
경로에 액세스하면 페이지가 실행 중이며 쿼리 데이터가 차단되었음을 나타냅니다. 마지막으로 명령줄에서 커밋합니다. 2. 먼저 /locktest1
경로에 액세스하여 데이터를 정상적으로 인쇄합니다. 그런 다음 명령줄에서 트랜잭션을 열어 배타적 잠금을 추가합니다. 데이터가 정상적으로 쿼리됩니다. 차단이 없다는 것은 Laravel의 컨트롤러 메서드에서 단독 잠금 작업이 성공하지 못했음을 의미합니다.
/locktest1
에 액세스하면 페이지가 대기 중입니다. 경로 2 /locktest2
에 액세스할 때 페이지도 새로 고쳐지기를 기다리고 있으며 이는 경로 2에 sleep()이 없기 때문에 데이터가 차단되어야 함을 나타내며 다음에서 즉시 실행됩니다. 정상적인 상황. 🎜10초 후 /locktest1
페이지에서 데이터가 출력되고, /locktest2
페이지에서도 데이터가 출력됩니다. 🎜🎜🎜🎜 이를 통해 위 테스트 3에서는 컨트롤러 메소드 종료 후 트랜잭션 자동 종료로 인해 발생하는 차단 효과가 발생하지 않았습니다. 🎜🎜위 내용은 개인적인 분석입니다. 혹시 지나가시는 사부님 계시다면 메시지 남겨주시면 정답 알려드리겠습니다! 🎜🎜더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 교육🎜을 방문하세요! ! 🎜위 내용은 laravel 독점 잠금 lockForUpdate() 사용 문제 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!