ホームページ > 記事 > PHPフレームワーク > thinkphp ロックの使用例と使用例を紹介します。
次のチュートリアル コラムでは、thinkphp ロックの使用方法と例を thinkphp チュートリアル コラムで紹介します。困っている友人の役に立てば幸いです。
開発要件では、同時リクエストという状況に遭遇することがあります。データベースの更新が完了する前に、別の選択で見つかったデータは更新前のデータとなり、クエリ データが不正確になります。 どうすれば解決できますか?この問題は、innoDB トランザクションとロックを使用して解決できます。現在の行の更新が完了する前に、この行の選択クエリ内のデータはロックされます。 たとえば、データベースには次のような 2 行のデータがあります。
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 に変更すると、インデックスの影響を受けなくなります。
関連する推奨事項:
以上がthinkphp ロックの使用例と使用例を紹介します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。