ホームページ >バックエンド開発 >PHPチュートリアル >PHP+MySQL を使用して同時実行性の高いロック トランザクションを処理する手順の詳細な説明
1. 背景:
データを挿入する際、テストテーブルに「mraz」というデータがあるかどうかを判断し、存在しない場合は挿入されます。目的は、ユーザー名「mraz」のレコードのみを挿入することです。$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);この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、PHP 中国語 Web サイトの他の関連記事に注目してください。 推奨書籍:
PHP で生成された QR コード ポスターのケース分析
PHP の js および css ファイルの動的圧縮手順の詳細な説明
以上がPHP+MySQL を使用して同時実行性の高いロック トランザクションを処理する手順の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。