ホームページ >バックエンド開発 >PHPチュートリアル >PHP+MySQL を使用して同時実行性の高いロック トランザクションを処理する手順の詳細な説明

PHP+MySQL を使用して同時実行性の高いロック トランザクションを処理する手順の詳細な説明

php中世界最好的语言
php中世界最好的语言オリジナル
2018-05-16 11:38:072793ブラウズ

PHP+MySQL を使用して同時実行性の高いロック トランザクションを処理する手順の詳細な説明

今回は、PHP+MySQLで高同時ロックトランザクションを処理する手順について詳しく説明します。PHP+MySQLが高同時ロックトランザクションを処理するための

注意事項は次のとおりです。実際のケースを見てみましょう。

1. 背景:

データを挿入する際、テストテーブルに「mraz」というデータがあるかどうかを判断し、存在しない場合は挿入されます。目的は、ユーザー名「mraz」のレコードのみを挿入することです。

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);
この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、PHP 中国語 Web サイトの他の関連記事に注目してください。

推奨書籍:

PHP で生成された QR コード ポスターのケース分析


PHP の js および css ファイルの動的圧縮手順の詳細な説明


PHP Excel の変更手順の詳細な説明


以上がPHP+MySQL を使用して同時実行性の高いロック トランザクションを処理する手順の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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