>  기사  >  PHP 프레임워크  >  thinkphp lock의 사용법과 예시를 소개합니다.

thinkphp lock의 사용법과 예시를 소개합니다.

藏色散人
藏色散人앞으로
2021-05-12 17:15:334467검색

다음 튜토리얼 칼럼인 thinkphp에서는 thinkphp lock의 사용법과 예시를 소개하겠습니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!

thinkphp lock의 사용법과 예시를 소개합니다.

개발 요구 사항에서 이러한 상황, 동시 요청이 발생하게 됩니다. 데이터베이스 업데이트가 완료되기 전에 다른 선택으로 찾은 데이터는 업데이트 전의 데이터가 되어 쿼리 데이터가 부정확해질 수 있습니다.

그럼 어떻게 해결하나요? 이 문제는 innoDB 트랜잭션 및 잠금을 사용하여 해결할 수 있습니다. 현재 행의 업데이트가 완료되기 전에 이 행에 대한 선택 쿼리의 데이터가 잠깁니다.

예를 들어, 우리 데이터베이스에는 다음과 같은 두 개의 데이터 행이 있습니다.
thinkphp lock의 사용법과 예시를 소개합니다.
id=1인 num 데이터를 1000으로 업데이트하고 10초 동안 대기합니다. 이때 id=1인 데이터를 선택하면 다음과 같이 됩니다. 업데이트가 끝날 때까지 기다립니다. id =2를 선택하면 10초 동안 기다릴 필요가 없으며 데이터가 즉시 획득됩니다.
이는 InnoDB의 행 잠금입니다. 현재 업데이트된 데이터 행만 잠그고 전체 테이블을 잠그지는 않습니다.
테스트 코드는 아래와 같습니다. 엔진을 MYISAM이 아닌 innoDB로 변경하세요.

class Index extends Controller
{
    public function index()
    {

        $model=Db::name('test');
        $model->startTrans();
        try{
            $list=$model->lock(true)->find();
            $model->where(['id'=>1])->data(['num'=>900])->update();//id为1的更新
            sleep(10);//等待10秒
            $model->commit();
            print_r($list);
        }catch (\Exception $exception){
            $model->rollback();
            throw $exception;

        }




    }


    public function index2(){

        $model=Db::name('test');
        $model->startTrans();
        try{
            $list=$model->lock(true)->where(['id'=>1])->find();//id为1在更新时,select id=1 会等待。把ID改为2时,不等待
            $model->commit();
            print_r($list);
        }catch (\Exception $exception){
            $model->rollback();
            throw $exception;

        }

    }
}

테스트 단계: index2를 요청한 후 index2를 요청할 때 index2의 인쇄 결과를 보기 전에 index2가 인덱스 로드가 완료될 때까지 기다리는 것을 볼 수 있습니다. index2의 id를 2로 변경하면 index의 영향을 받지 않습니다.

관련 추천: 최신 10개 thinkphp 비디오 튜토리얼

위 내용은 thinkphp lock의 사용법과 예시를 소개합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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