ホームページ >バックエンド開発 >PHPチュートリアル >PHP + MySQL による高同時ロックのトランザクション処理問題の解決策
この記事では主に、PHP+MySQL の高同時実行ロックのトランザクション処理の問題の解決策を紹介します。必要な方は参考にしてください。 PHP+MySQL の高い同時実行性によるロック トランザクション処理の問題の解決策。参考のために皆さんと共有してください。詳細は次のとおりです:
1. 背景:データを挿入するときに、テストテーブルにユーザー名が「mraz」であるかどうかを判断します。存在しない場合は挿入し、存在する場合は「挿入済み」というプロンプトが表示されます。目的は、ユーザー名「mraz」のレコードを 1 つだけ挿入することです。
2. 一般的なプログラムロジックは次のとおりです:$conn = mysqli_connect('127.0.0.1', 'root', '111111') or die(mysqli_error()); mysqli_select_db($conn, 'mraz'); $rs = mysqli_query($conn, 'SELECT count(*) as total FROM test WHERE username = "mraz" '); $row = mysqli_fetch_array($rs); if($row['total']>0){ exit('exist'); } mysqli_query($conn, "insert into test(username) values ('mraz')"); var_dump('error:'.mysqli_errno($conn)); $insert_id = mysqli_insert_id($conn); echo 'insert_id:'.$insert_id.'<br>'; mysqli_free_result($rs); mysqli_close($conn);3. 通常、リクエストの数が少ない場合、プログラムロジックに問題はありません。ただし、同時実行性の高いリクエストが実行されると、プログラムは期待どおりに実行されず、ユーザー名「mraz」を持つ複数のレコードが挿入されます。
4. 解決策
:mysql の FOR UPDATE ステートメントとトランザクションを分離します。 FOR UPDATE は InnoDB にのみ適用可能であり、有効にするにはトランザクション (BEGIN/COMMIT) 内にある必要があることに注意してください。 コードを調整すると、コードは次のようになります:
$conn = mysqli_connect('127.0.0.1', 'root', '111111') or die(mysqli_error()); mysqli_select_db($conn, 'mraz'); mysqli_query($conn, 'BEGIN'); $rs = mysqli_query($conn, 'SELECT count(*) as total FROM test WHERE username = "mraz" FOR UPDATE'); $row = mysqli_fetch_array($rs); if($row['total']>0){ exit('exist'); } mysqli_query($conn, "insert into test(username) values ('mraz')"); var_dump('error:'.mysqli_errno($conn)); $insert_id = mysqli_insert_id($conn); mysqli_query($conn, 'COMMIT'); echo 'insert_id:'.$insert_id.'<br>'; mysqli_free_result($rs); mysqli_close($conn);5. 次に、php のcurlを使用して、このphpスクリプトの同時リクエストをシミュレートします。ユーザー名を持つレコードは1つだけになります。 「ムラズ」。プログラム実行で期待される結果を達成する~
関連する推奨事項:
PHP+Mysql で SQL インジェクションを防ぐ方法PHP+MySQL がページング表示を実装する方法PHP+MySQL タイミング データ統計の最適化以上がPHP + MySQL による高同時ロックのトランザクション処理問題の解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。