PHP ドキュメントではトランザクションの利点を強調し、データベース内でアトミックで一貫性があり、分離され、耐久性のある操作を保証するトランザクションの機能を強調しています。 .
質問:
これは、トランザクションを同時に実行する個別の PHP スクリプトが干渉なしで動作できることを意味しますか?
干渉の詳細:
次のデータを持つテーブルemployees について考えます:
id | name | salary |
---|---|---|
1 | ana | 10000 |
同様のコードを持つ 2 つのスクリプトが同時に実行されます:
script1.php と script2.php:
<code class="php">$conn->beginTransaction(); $stmt = $conn->prepare("SELECT * FROM employees WHERE name = ?"); $stmt->execute(['ana']); $row = $stmt->fetch(PDO::FETCH_ASSOC); $salary = $row['salary']; $salary = $salary + 1000;//increasing salary $stmt = $conn->prepare("UPDATE employees SET salary = {$salary} WHERE name = ?"); $stmt->execute(['ana']); $conn->commit();</code>
さまざまな実行シナリオでの「ana」の給与の結果について疑問が生じます。
答え:
結果は分離レベルによって異なります。 MySQL の InnoDB テーブル エンジン用に構成されています。 SQL 標準に従って、4 つの分離レベルが存在します。
指定されたシナリオでは、SERIALIZABLE 分離レベルを使用し、自動コミットを無効にすると、各トランザクションが分離されて順次実行されるため、給与は 12000 になります。
ただし、他の分離レベルまたは自動コミットが有効になっている SERIALIZABLE を使用すると、給料は 12000 になります。の場合、結果は 11000 になります。これは、これらの場合、トランザクションが重複する可能性があり、潜在的な干渉が発生する可能性があるためです。ロック読み取りの使用も結果に影響を与える可能性があり、すべての分離レベルで 12000 の給与が発生する可能性があります。
したがって、使用される特定の分離レベルと構成設定によって、PHP スクリプトの同時トランザクション間の干渉の有無が決まります。 .
以上がPDO MySQL での同時 PHP トランザクションは相互に干渉する可能性がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。