ホームページ  >  記事  >  PHPフレームワーク  >  thinkphp ロックの使用例と使用例を紹介します。

thinkphp ロックの使用例と使用例を紹介します。

藏色散人
藏色散人転載
2021-05-12 17:15:334491ブラウズ

次のチュートリアル コラムでは、thinkphp ロックの使用方法と例を thinkphp チュートリアル コラムで紹介します。困っている友人の役に立てば幸いです。

thinkphp ロックの使用例と使用例を紹介します。

開発要件では、同時リクエストという状況に遭遇することがあります。データベースの更新が完了する前に、別の選択で見つかったデータは更新前のデータとなり、クエリ データが不正確になります。

どうすれば解決できますか?この問題は、innoDB トランザクションとロックを使用して解決できます。現在の行の更新が完了する前に、この行の選択クエリ内のデータはロックされます。

たとえば、データベースには次のような 2 行のデータがあります。


thinkphp ロックの使用例と使用例を紹介します。 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;

        }

    }
}

テスト手順: インデックスをリクエストした後、インデックス 2 をリクエストすると、インデックス 2 の印刷結果が表示される前に、インデックスのロードが完了するまでインデックス 2 が待機することがわかります。 Index2 の ID を 2 に変更すると、インデックスの影響を受けなくなります。

関連する推奨事項:

最新の 10 件の thinkphp ビデオ チュートリアル

以上がthinkphp ロックの使用例と使用例を紹介します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。