ホームページ  >  記事  >  バックエンド開発  >  PHP + MySQL による高同時ロックのトランザクション処理問題の解決策

PHP + MySQL による高同時ロックのトランザクション処理問題の解決策

不言
不言オリジナル
2018-05-02 09:51:291839ブラウズ

この記事では主に、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 &#39;insert_id:&#39;.$insert_id.&#39;<br>&#39;;
mysqli_free_result($rs);
mysqli_close($conn);

3. 通常、リクエストの数が少ない場合、プログラムロジックに問題はありません。ただし、同時実行性の高いリクエストが実行されると、プログラムは期待どおりに実行されず、ユーザー名「mraz」を持つ複数のレコードが挿入されます。

4. 解決策

:mysql の FOR UPDATE ステートメントとトランザクションを分離しますFOR UPDATE は InnoDB にのみ適用可能であり、有効にするにはトランザクション (BEGIN/COMMIT) 内にある必要があることに注意してください。 コードを調整すると、コードは次のようになります:

$conn = mysqli_connect(&#39;127.0.0.1&#39;, &#39;root&#39;, &#39;111111&#39;) or die(mysqli_error());
mysqli_select_db($conn, &#39;mraz&#39;);
mysqli_query($conn, &#39;BEGIN&#39;);
$rs = mysqli_query($conn, &#39;SELECT count(*) as total FROM test WHERE username = "mraz" FOR UPDATE&#39;);
$row = mysqli_fetch_array($rs);
if($row[&#39;total&#39;]>0){
  exit(&#39;exist&#39;);
}
mysqli_query($conn, "insert into test(username) values (&#39;mraz&#39;)");
var_dump(&#39;error:&#39;.mysqli_errno($conn));
$insert_id = mysqli_insert_id($conn);
mysqli_query($conn, &#39;COMMIT&#39;);
echo &#39;insert_id:&#39;.$insert_id.&#39;<br>&#39;;
mysqli_free_result($rs);
mysqli_close($conn);

5. 次に、php のcurlを使用して、このphpスクリプトの同時リクエストをシミュレートします。ユーザー名を持つレコードは1つだけになります。 「ムラズ」。プログラム実行で期待される結果を達成する~

関連する推奨事項:

PHP+Mysql で SQL インジェクションを防ぐ方法

PHP+MySQL がページング表示を実装する方法

PHP+MySQL タイミング データ統計の最適化

以上がPHP + MySQL による高同時ロックのトランザクション処理問題の解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。