複数のユーザーがデータベースに同時にアクセスするシナリオでは、データの不一致または更新損失が頻繁に発生することがよくあります。これは主に、複数のリクエストが同じデータを同時に動作させ、人種条件をもたらすためです。
ロックは、同時紛争を解決する効果的な方法の1つです。 PHPでは、MySQLのトランザクションメカニズムを使用して、データのアクセス順序と変更プロセスを制御できます。
自動コミットをオフにし、トランザクションコミットとロールバックを手動で管理することにより、データ操作の原子性を確保できます。サンプルコードは次のとおりです。
$conn = new mysqli("localhost", "username", "password", "database");
$conn->autocommit(false);
同時読み取り中にデータが変更されるのを防ぐために、ロックされた読み取りステートメントSELECTを使用できます...更新のために、現在のトランザクションのデータが他のトランザクションによって変更されないことを確認できます。
$conn->query("SELECT * FROM mytable WHERE id = 1 FOR UPDATE");
ロックステートメントでデータをロックした後、更新操作を実行し、トランザクションを送信してデータの一貫性を確保します。
$conn->query("SELECT * FROM mytable WHERE id = 1 FOR UPDATE");
// データを変更します
$conn->query("UPDATE mytable SET name = 'newname' WHERE id = 1");
$conn->commit();
同時性が高い場合、デッドロックは避けられません。ロック待機タイムアウト時間を設定することでデッドロックの発生を減らし、タイムアウト後にトランザクションをロールバックしてロックを解放できます。
$conn->query("SET innodb_lock_wait_timeout = 3");
ロックに加えて、次の方法を使用して、高い並行性環境でのシステムパフォーマンスを改善できます。
データを複数のデータベースインスタンスに分割し、負荷を分散させ、単一階建ての圧力の低減、全体的なスループットの改善を分けます。
ホットスポットデータをキャッシュすることにより、直接データベースアクセスの頻度を減らし、競合の同時の可能性を減らし、応答速度を高速化します。
合理的に設計インデックスとテーブルパーティションを設計し、クエリパスを最適化し、ロック保持時間を短縮し、同時処理機能をさらに改善します。
PHPとMySQLの間の高い並行性シナリオでは、トランザクションとロックメカニズムの合理的な使用は、データの一貫性を確保するための重要な手段です。同時に、データシェルディング、キャッシュ、データベースの最適化を組み合わせることで、システムの安定性とパフォーマンスが大幅に向上する可能性があります。開発者は、ビジネスニーズに照らしてさまざまな戦略を柔軟に使用し、システムのパフォーマンスを継続的に監視および調整する必要があります。
$conn = new mysqli("localhost", "username", "password", "database");
$conn->autocommit(false);
$conn->query("SELECT * FROM mytable WHERE id = 1 FOR UPDATE");
$conn->query("UPDATE mytable SET name = 'newname' WHERE id = 1");
$conn->commit();
$conn->query("SET innodb_lock_wait_timeout = 3");