この記事では主に、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);
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);
関連する推奨事項:
PHP+Mysql で SQL インジェクションを防ぐ方法PHP+MySQL がページング表示を実装する方法PHP+MySQL タイミング データ統計の最適化以上がPHP + MySQL による高同時ロックのトランザクション処理問題の解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。