MySQL の基盤となる最適化を実装する方法: トランザクション ロックの高度なパフォーマンスの最適化とデッドロックを回避する方法
データベース システムでは、トランザクション ロックが保証されています。データの一貫性と同時アクセスのための重要なメカニズムの 1 つ。ただし、同時実行性が高いシナリオでは、トランザクション ロックによりパフォーマンスの問題やデッドロックが発生する可能性があります。 MySQL のパフォーマンスを向上させるには、トランザクション ロックに対して高度なパフォーマンスの最適化を実行し、デッドロックを回避するための措置を講じる必要があります。この記事では、MySQL の基礎となるトランザクション ロックの高度なパフォーマンス最適化方法とデッドロックを回避するテクニックを紹介し、具体的なコード例を示します。
たとえば、注文テーブルがあり、トランザクションで注文ステータスと在庫数量を変更する必要があるとします。注文テーブル全体のすべての行がロックされている場合、同時実行パフォーマンスが低下します。代わりに、変更が必要な注文明細のみをロックして、ロックの粒度を下げることができます。
START TRANSACTION; SELECT * FROM orders WHERE order_id = <order_id> FOR UPDATE; -- 这里可以执行一些修改操作 COMMIT;
InnoDB エンジンは MySQL のデフォルトのトランザクション エンジンであり、行レベルのロックを使用します。同時実行性が高いシナリオでは、次の方法で InnoDB エンジンのロック同時実行性のパフォーマンスを向上させることができます。
(1) トランザクション分離レベルを調整する: 一部の特定のシナリオでは、トランザクション分離レベルを調整して読み取りを行うことができます。 uncommitted または、ロック競合を軽減するために commit を読み取ります。
(2) インデックスの合理的な使用: 頻繁にアクセスされる列にインデックスを使用すると、不必要な全テーブル スキャンが削減され、ロック保持時間が短縮されます。
START TRANSACTION; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 在这里执行一些查询操作 COMMIT;
(1) トランザクションの長さを最小限に抑える: トランザクションがロックを保持する時間が長ければ長いほど、他のトランザクションの待機時間が長くなります。ロック。したがって、ロックの待機時間が長くなる可能性のある操作は、複数の短いトランザクションに分割できます。
(2) 合理的なロック タイムアウトの設定: トランザクションが一定のしきい値を超えてロックを待機する場合、長時間のロック待機を回避するためにロック タイムアウトを設定することで、待機を自動的に終了できます。
サンプル コード:
SET innodb_lock_wait_timeout = 5;
たとえば、2 つのトランザクションがあり、1 つのトランザクションは注文テーブルのデータを変更する必要があり、もう 1 つのトランザクションは在庫テーブルのデータを変更する必要があるとします。 2 つのトランザクションが同じ順序でロックを取得した場合、デッドロックは発生しません。
@Transactional public void updateOrderAndInventory(int orderId, int inventoryId) { synchronized (Order.class) { updateOrder(orderId); } synchronized (Inventory.class) { updateInventory(inventoryId); } }
サンプル コード:
SET innodb_deadlock_detect = ON; SET innodb_lock_wait_timeout = 5;
MySQL の基礎となるトランザクション ロックの高度なパフォーマンスの最適化とデッドロックを回避する方法は、データベースの同時実行パフォーマンスを向上させ、データの一貫性を確保するために非常に重要です。ロックの粒度を減らし、ロックの同時実行パフォーマンスを向上させ、ロックの待機時間を短縮することにより、MySQL トランザクション ロックのパフォーマンスを効果的に向上させることができます。同時に、トランザクションシーケンスとデッドロックタイムアウトを適切に設定することで、デッドロックの発生を効果的に回避できます。これらのメソッドを合理的に選択して使用することで、MySQL の基礎となるトランザクション ロックのパフォーマンスを最適化し、アプリケーションの同時実行パフォーマンスと安定性を向上させることができます。
参考資料:
以上がMySQL の基盤となる最適化を実装する方法: トランザクション ロックの高度なパフォーマンスの最適化とデッドロックを回避する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。