MySQLをしばらく使用している場合は、「テーブルレベルのロック」および「行レベルのロック」という用語を聞いたことがあるでしょう。これらの用語は、MySQLのロックの粒度を指します。このブログでは、それらの意味と使用目的について説明します。
MySQLのロックグラニュラリティとは何ですか?
各MySQLストレージエンジンは、ロックに対してさまざまなレベルの粒度をサポートしています。 MySQLには、行レベルのロック、ページレベルのロック、およびテーブルレベルのロックの3つのロックレベルがあります。各MySQLストレージエンジンは異なる方法でロックを実装し、いくつかの明確な長所と短所を提供します。まず、ロックの粒度とは何かを調べ、次に、さまざまなストレージエンジンですべてがどのように機能するかを調べます。
大まかに言えば、MySQLのロックはこれらのカテゴリの1つに分類されます。ロックには次のようなものがあります:
-
ページレベル-このようなタイプのロックの粒度は、MySQLの古いエンジン、特にBDBで利用可能でした。 MySQL5.1で廃止されました。つまり、BDBは古いバージョンのMySQLに含まれているストレージエンジンであり、ページレベルのロックを実行するトランザクションストレージエンジンでした。これらのタイプのロックの細かさは使用されなくなったため、ここでは詳しく説明しませんが、一般に、これらのロックは特定のページにあるデータとインデックスに限定されます。 BDBについて詳しく知りたい場合は、MariaDBのページにさらに情報が記載されているはずです。
-
テーブルレベル-MySQLは、InnoDBを除くすべてのストレージエンジンにテーブルレベルのロックを使用します。
-
行レベル-行レベルのロックはInnoDBによって使用されます。
MySQLはInnoDBを除くすべてのストレージエンジンにテーブルレベルのロックを使用します。つまり、テーブルレベルのロックはMyISAM、MEMORY、およびMERGEストレージエンジンを実行するテーブルに使用され、一度に1つのセッションのみがテーブルを更新できます。 。テーブルレベルのロックには、行レベルのロックに比べていくつかの明確な利点があります(たとえば、行レベルのロックは行の行(またはグループ)ごとにいくらかのメモリを必要とするため、一般にテーブルレベルのロックは行レベルのロックよりも少し少ないメモリを必要としますロックされており、関係するロックは1つだけなので、通常は高速です。テーブルにロックがない場合、テーブル書き込みロックがテーブルに配置されます。問題のテーブルに既存のロックがある場合、テーブルロック要求が入力されます。読み取り要求キュー。テーブルレベルのロックには、それ自体に固有のいくつかの明確な欠点もあることを言及する価値があります。たとえば、「行き来する」多くのトランザクションを必要とするアプリケーションにはあまり適していない可能性があります(たとえば、 、オンラインバンキングアプリケーション)。一度に1つのセッションのみがテーブルに書き込むことができ、テーブルレベルのロックをサポートする一部のテーブル(MyISAMなど)はACIDモデルをサポートしないためです。
次に例を示します。データベース内の2つのテーブルを使用する銀行のアプリケーションを想像してください。たとえば、これらのテーブルは「チェック」と「節約」と呼ばれます。あなたは人の当座預金口座から彼の普通預金口座に100ドルを移動する必要があります。論理的には、次の手順を実行します。
-
アカウントの残高が100ドルを超えていることを確認してください。
-
当座預金口座から100ドルを差し引きます。
-
普通預金口座に100ドルを追加します。
これらのアクションを実行するには、次のようないくつかのクエリが必要になります。
SELECT balance FROM checking WHERE account_id = 123;
UPDATE checking SET balance = balance - 100 WHERE account_id = 123;
UPDATE savings SET balance = balance + 100 WHERE account_id = 123;
これらのクエリは単純に見えるかもしれませんが、MyISAMを使用する場合(テーブルレベルのロックをサポートするプライマリストレージエンジンの1つであるため、例としてMyISAMを使用します)、次の事実に精通している必要があります。エンジンはACIDもサポートしていません。つまり、これらのクエリのいずれかを実行しているときにデータベースサーバーがクラッシュした場合、運が悪くなります。つまり、両方のアカウントまたはどちらのアカウントにも現金が入らない可能性があります。 MySQLでACIDベースのトランザクションをサポートする唯一のエンジンはInnoDBであるため、信頼性の高いトランザクションが多数必要な場合は、調査する価値があるかもしれません。 InnoDBは、行レベルのロックもサポートしています。これについては、これから検討します。
MySQLは、InnoDBテーブルの行レベルのロックを使用して、複数のセッションによる同時書き込みアクセスをサポートします。行レベルのロックを使用する利点のいくつかには、単一の行を長期間ロックできることや、多くのスレッドが異なる行にアクセスするときのロックの競合が少ないことが含まれます。ただし、行レベルのロックには欠点もあります。その1つは、行レベルのロックは通常、ページレベルまたはテーブルレベルのロックよりも多くのメモリを消費することです。また、エンジンが原因で、通常、ページレベルまたはテーブルレベルのロックよりも低速です。より多くのロックを取得する必要があります。 InnoDBは、行レベルのロックメカニズムをサポートするエンジンの1つです。また、ACIDに準拠しているため、トランザクションベースのアプリケーションに最適です(上記の例を参照)。次に、MySQLストレージエンジンの1つでロックの粒度がどのように機能するかを調べます。
InnoDBでロックの粒度はどのように機能しますか?
InnoDBは行レベルのロックをサポートしていることで広く知られていますが、エンジンが複数のタイプのロックをサポートしていることも注目に値します。つまり、行レベルとテーブルレベルの両方のロックを使用できます。 InnoDBは、テーブルインデックスを検索またはスキャンするときに検出するインデックスレコードに共有ロックまたは排他ロックを設定することにより、行レベルのロックを実行します。共有ロックは、ロックを保持しているトランザクションが問題の行を読み取ることを許可するようなロックですが、排他的ロックは、ロックを保持しているトランザクションが行を更新または削除することを許可します。
InnoDBには、他の種類のロックもあります。その中には、共有ロックと排他ロック、インテンションロック、レコードロック、ギャップロック、ネクストキーロック、ネクストインテンションロックなどがあります。たとえば、インテンションロックは共有または排他的にすることもできます。このようなロックは通常、トランザクションがテーブル内の個々の行に特定のタイプのロック(共有ロックまたは排他ロック)を設定することを意図していることを示します。レコードロックはインデックスレコードなどをロックします。
一般に、InnoDBロックの粒度は、他のMySQLストレージエンジン(MyISAMなど)に存在するロックの粒度とは異なります。これは、テーブルレベルのロックが使用されている場合、特定のテーブルを更新するセッションが1つだけであるためです。時間が実行できます。行レベルのロックが使用されている場合、MySQLは複数のセッションにわたる同時書き込みアクセスをサポートするため、行レベルのロックストレージエンジン(InnoDB)はミッションクリティカルなアプリケーションに適しています。
MySQLのロックの粒度とロックレベルは素晴らしいことですが、問題を引き起こす可能性もあります。ロックの粒度によって引き起こされる最も頻繁な問題の1つはデッドロックです。デッドロックは、それぞれが他のトランザクションに必要なロックを保持しているために、異なるMySQLトランザクションを続行できない場合に発生します。ありがたいことに、InnoDBストレージエンジンを使用する場合、デッドロック検出はデフォルトで有効になっています。デッドロックが検出されると、InnoDBはトランザクションを自動的にロールバックします。 MySQLでロックの粒度を処理するときにデッドロックが発生した場合でも、心配する必要はありません。単にトランザクションを再開することを検討してください。データベースをプロアクティブに監視するには、ClusterControlが提供する機能の利用も検討する必要があります。
ClusterControlはどのように役立ちますか?
ここに、Severeninesによって開発されたClusterControlが役立つもののいくつかを示します。
-
すべてのビジネスデータの保護
-
データが破損している場合(ACID準拠のストレージエンジンを使用していないことが原因である可能性があります。上記の他の要因)ツールは、データを回復できることを実際に検証する自動プロセスを実行できます。
-
このツールは、バックアップされていないデータベースを通知したり、バックアップのステータスを表示したりできます(かどうか)。成功したか失敗したか)
-
-
データベース操作の自動化
-
ClusterControlは、システム管理者、開発者、およびDBAが、業界を使用して最小限のリスクでデータベースクラスター全体を効率的に管理できるようにするのに役立ちます。ベストプラクティス
-
-
データベースインフラストラクチャ全般を効果的に管理する
-
今日のテクノロジーの変化と高度なインフラストラクチャソリューションを組み合わせるには、高可用性と最適なパフォーマンスを実現するための高度なツールと知識が必要です。ビジネスクリティカルなアプリケーション。 ClusterControlは、MySQL、MariaDB、MongoDB、PostgreSQL、TimeScaleDBなどの最も一般的なオープンソースデータベーステクノロジーの展開、監視、管理、スケーリングにも役立ちます。
-
ClusterControlがビジネス運営の合理化にどのように役立つかについて詳しくは、Severeninesデータベースのブログをご覧ください。
さまざまなMySQLストレージエンジンには、さまざまなタイプのロック粒度があります。使用するストレージエンジンを決定する前に、問題のストレージエンジンに関する情報をできるだけ多く知ってください(たとえば、すでに述べたように、ミッションクリティカルなデータを処理する場合はACIDに準拠していないため、MyISAMは避ける必要があります)。ロックの細かさ、デッドロックなど、関連するすべてのパフォーマンスへの影響と賢明な選択。