ホームページ  >  記事  >  データベース  >  MySQL でのロックの実装を紹介する記事

MySQL でのロックの実装を紹介する記事

PHPz
PHPzオリジナル
2023-04-19 14:11:191483ブラウズ

MySQL ロックの実装

MySQL は、多数の同時ユーザーとトランザクションの処理をサポートする、非常に人気のあるリレーショナル データベース管理システムです。高い同時実行性の場合、MySQL のロック メカニズムは重要なコンポーネントです。ロック メカニズムを合理的に使用して同時実行パフォーマンスを効果的に向上させる方法は、MySQL 最適化の重要な部分です。この記事では、MySQL でのロックの実装方法と、パフォーマンスを最大化するためにさまざまなロック タイプを選択する方法を紹介します。

概要

同時にアクセスされるデータベースでは、複数のユーザーが共有データを変更しようとすると、さまざまなデータの一貫性の問題が発生する可能性があります。最も一般的な問題は、読み取りと書き込みの競合とデータの競合状態です。これらの問題を解決するために、MySQL はデータの一貫性を確保しながら同時アクセスを可能にするさまざまなロック タイプを提供します。

MySQL のロックは、主に共有ロック (Shared Lock) と排他ロック (Exclusive Lock) の 2 つのカテゴリに分類されます。共有ロックを使用すると、複数のユーザーが同時にリソースにアクセスできます。これらのユーザーはリソースの読み取りのみが可能ですが、変更はできません。したがって、ユーザーがすでに共有ロックを保持している場合、他のユーザーは共有ロックを使用して同じリソースを読み取ることはできますが、排他ロックを使用してリソースを変更することはできません。排他ロックでは、一度に 1 人のユーザーのみが同じリソースにアクセスでき、複数のユーザーが同時にロックを保持することはできません。

MySQL ロックの実装

MySQL のロック実装方法には、テーブル ロック、行ロック、ページ ロック、タプル ロック (タプル ロック)、ギャップ ロック (ギャップ ロック) などがあります。

  1. テーブル ロック

テーブル ロックは最も基本的なロック方法で、変更操作中にテーブル全体がロックされます。したがって、他のユーザーはテーブルにアクセスできなくなり、同時実行パフォーマンスが低下します。このロック メカニズムは、テーブルのデータが小さい場合、または同時アクセスがほとんどない場合に適切に機能します。ただし、大規模なデータベースや同時実行性の高いデータベースでは、テーブル ロックにより同時実行性の問題が発生し、システムのパフォーマンスが低下する可能性があります。

テーブル ロックの構文は次のとおりです。

  • すべてのテーブルをロックします: LOCK TABLES table_name [AS エイリアス] lock_type[,table_name [AS エイリアス] lock_type] …
  • Unlock: UNLOCK TABLES

そのうち、lock_type は次のタイプになります:

  • READ: 共有読み取りロック。
  • WRITE: 排他的書き込みロック。
  1. 行ロック

行ロックは、MySQL のより効率的なロック メカニズムです。テーブル内のレコードを変更する場合、MySQL は条件を満たすテーブル内の行のみをロックします。ロックを必要としない行への他のアクセスには影響しません。同時実行性が高くデータ量が多い場合、行ロックを使用すると、ロックの範囲と時間が効果的に削減され、システムのパフォーマンスが向上します。

InnoDB ストレージ エンジンでは、行ロックがデフォルトのロック メカニズムです。

行ロック構文:

  • オープントランザクション: START TRANSACTION
  • 行ロック: SELECT… FOR UPDATE または UPDATE… WHERE…
  • トランザクションを送信: COMMIT または ROLLBACK

このうち、SELECT ... FOR UPDATE は、マークされた行をロックして、その行が他のトランザクションによって変更されるのを防ぐことができます。 UPDATE ... WHERE ... ステートメントは、条件を満たす 1 つ以上の行をロックすることもできます。

  1. ページロック

ページロックはMySQLのロック機構で、テーブルをスキャンする際にページ単位でロックします。ページはより多くの行で構成されているため、複数のレコードを変更する場合は、ページ ロックの方が行ロックよりも効果的です。一方、行ロックは行ごとに個別に動作するため、複数の行を変更する場合は動作が遅くなります。

名前が示すように、ページ ロックはページをロックすることです。特定のページを変更するプロセス中、ページ レベルのロックはページ全体を保護するだけであり、他のページはロックされないことをシステムに通知します。他の取引の遂行を妨げます。テーブル全体またはページのインデックスをロックすると、ロックしすぎる行が回避されますが、同時実行性の問題が発生する可能性があります。

ページ ロックの使用方法:

  • InnoDB ストレージ エンジンのモードを変更し、コミット モード (commit_mode) を 2 に設定します。これは、ページ レベルのロックを使用することを意味します。
  • SQL コマンドを実行する各段階で、レコードをロックおよびロック解除します。

次のコマンドを使用すると、InnoDB エンジンでページ レベルのロックを使用できるようになります:

  • SET GLOBAL innodb_locks_unsafe_for_binlog=1;
  • SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ;

ページ ロックを使用する場合は、SQL ステートメントで LIMIT を使用してクエリ行数を制限しないように注意する必要があります。これにより、データベースが行数から変更される可能性があります。レベル ロックをテーブル レベル ロックに変更します。

  1. タプル ロック

タプル ロックは、タプル ロックとも呼ばれ、MySQL ストレージ エンジンのロックです。 InnoDB エンジンでは、同時操作をサポートするために、タプル ロックは「一意でない」セカンダリ インデックスにのみ適用されます。タプルが別のトランザクションによってロックされている場合、他のトランザクションは同じインデックス値を持つレコードの変更のみを完了でき、データ行全体の変更は完了できません。

タプル ロックの基本構文:

  • SELECT … FROM table_name WHERE key_column=user_input FOR UPDATE;
  • UPDATE … WHERE key_column=user_input;

このうち、user_input はエンド ユーザーの入力を表し、単一の値、条件文、範囲などを指定できます。

タプル ロックを使用するときは注意してください。不合理に使用すると、データベースの同時実行パフォーマンスが大幅に低下します。

  1. ギャップ ロック

ギャップ ロックはギャップ ロックとも呼ばれ、通常、非反復読み取りを防止するために使用されます。一度に複数の行にまたがる SQL 操作でよく使用されます。 ######例えば:###

SELECT c1 FROM tbl WHERE c1 BETWEEN 10 and 20 FOR UPDATE;

現時点では、データベースは c1 値が 10 ~ 20 のすべての行をロックする必要があります。対応するロック タイプはギャップ ロックと呼ばれ、ギャップ内にあるが存在しない値をロックします。

ギャップ ロックの使用方法:

  • ファントム読み取りビュー (MVCC) を使用して、進行中の読み取り操作を追跡し、将来の読み取り操作に行レベルの読み取りロックまたはギャップ ロックを提供します。
  • ギャップ チェック: S のギャップ ロックは行を 1 つずつチェックし、「反復読み取り」を維持しながらこれらの行が更新または削除されないようにします。
  • ギャップ ロックとそのアクセスに関する最も重要な問題の 1 つは、他のものの同時操作に細心の注意を払うことです。

要約

実際の開発では、デッドロックを回避し、システムの同時実行性を向上させるために、実際のニーズに応じて正しいロック タイプを選択し、適切なロックを使用する必要があります。システムパフォーマンスの低下。 MySQL が提供するさまざまなロック機能により、トランザクション操作や複数ユーザーによる同時アクセスの問題を解決できます。

適切な MySQL ロック メカニズムを正しく選択すると、システムのパフォーマンスと同時実行性が効果的に向上し、アプリケーションの堅牢性と信頼性が向上します。

以上がMySQL でのロックの実装を紹介する記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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