laravel 독점 잠금 lockForUpdate() 사용 문제 분석
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
테스트 3: Laravel 컨트롤러 방법 및 명령줄 혼합 테스트 독점 잠금
1 먼저 명령줄에서 트랜잭션을 열어 독점 잠금을 추가합니다. 테스트 1의 명령줄 1 작업과 동일합니다.
그런 다음/locktest1
경로에 액세스하면 페이지가 실행 중이며 쿼리 데이터가 차단되었음을 나타냅니다. 마지막으로 명령줄에서 커밋합니다. 2. 먼저 /locktest1
경로에 액세스하여 데이터를 정상적으로 인쇄합니다. 그런 다음 명령줄에서 트랜잭션을 열어 배타적 잠금을 추가합니다. 데이터가 정상적으로 쿼리됩니다. 차단이 없다는 것은 Laravel의 컨트롤러 메서드에서 단독 잠금 작업이 성공하지 못했음을 의미합니다.
/locktest1
에 액세스하면 페이지가 대기 중입니다. 경로 2 /locktest2
에 액세스할 때 페이지도 새로 고쳐지기를 기다리고 있으며 이는 경로 2에 sleep()이 없기 때문에 데이터가 차단되어야 함을 나타내며 다음에서 즉시 실행됩니다. 정상적인 상황. 🎜10초 후 /locktest1
페이지에서 데이터가 출력되고, /locktest2
페이지에서도 데이터가 출력됩니다. 🎜🎜🎜🎜 이를 통해 위 테스트 3에서는 컨트롤러 메소드 종료 후 트랜잭션 자동 종료로 인해 발생하는 차단 효과가 발생하지 않았습니다. 🎜🎜위 내용은 개인적인 분석입니다. 혹시 지나가시는 사부님 계시다면 메시지 남겨주시면 정답 알려드리겠습니다! 🎜🎜더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 교육🎜을 방문하세요! ! 🎜위 내용은 laravel 독점 잠금 lockForUpdate() 사용 문제 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Laravel 이메일 전송이 실패 할 때 반환 코드를 얻는 방법. Laravel을 사용하여 응용 프로그램을 개발할 때 종종 확인 코드를 보내야하는 상황이 발생합니다. 그리고 실제로 ...

laravel 일정 작업 실행 비 응답 문제 해결 Laravel의 일정 작업 일정을 사용할 때 많은 개발자 가이 문제에 직면합니다 : 스케줄 : 실행 ...

Laravel의 이메일을 처리하지 않는 방법은 LaRavel을 사용하는 것입니다.

DCAT를 사용할 때 DCATADMIN (LARAVEL-ADMIN)에서 데이터를 추가하려면 사용자 정의의 테이블 기능을 구현하는 방법 ...

Laravel - 덤프 서버 - Laravel 덤프 서버는 Laravel 5.7 버전과 함께 제공됩니다. 이전 버전에는 덤프 서버가 포함되어 있지 않습니다. 덤프 서버는 laravel/laravel 작곡가 파일의 개발 종속성이 됩니다.

Laravel 프레임 워크 및 Laravel 프레임 워크 및 Redis를 사용할 때 Redis 연결을 공유하는 데 영향을 줄 수 있습니다. 개발자는 문제가 발생할 수 있습니다. 구성을 통해 ...

Laravel 다중 테넌트 확장 패키지 패키지 패키지 패키지 패키지 Stancl/Tenancy, ...

Laravel - 액션 URL - Laravel 5.7에는 "호출 가능한 액션 URL"이라는 새로운 기능이 도입되었습니다. 이 기능은 액션 메소드에서 문자열을 허용하는 Laravel 5.6의 기능과 유사합니다. Laravel 5.7에 도입된 새로운 구문의 주요 목적은
