目次
読み書きロック
ロックの粒度
テーブルロック(テーブルロック)
行ロック (行ロック)

【MySQL】同時実行制御

Feb 25, 2017 am 10:25 AM


同時にデータを変更する必要があるクエリが複数ある場合、同時実行制御の問題が発生します。ここでは、サーバー層とストレージ エンジン層の 2 つのレベルでの MySQL の同時実行制御について説明します。同時実行制御は大きなテーマであり、それについて詳しく説明した理論文献が大量にあります。ここでは、MySQL が同時読み取りと書き込みをどのように制御するかについて簡単に説明するだけです。

UNIX システムの電子メール ボックスを例に挙げます。典型的な mbox ファイル形式は非常に単純です。 mbox メールボックス内のすべての電子メールは一緒にシリアル化され、エンドツーエンドで接続されます。この形式は、Feixi の電子メール情報を読むのに非常に使いやすく、ファイルの末尾に新しい電子メールのコンテンツを追加するだけで電子メールを配信することも簡単です。

しかし、2 つのプロセスが同時に同じメールボックスにメールを配信するとどうなるでしょうか?明らかに、メールボックス内のデータは破棄され、2 つの電子メールの内容がメールボックス ファイルの末尾に追加されます。適切に設計されたメールボックス配信システムでは、ロックを使用してデータの破損を防ぎます。顧客がメールを配信しようとして、メールボックスが別の顧客によってロックされている場合、配信が行われる前にロックが解除されるまで待つ必要があります。

このロック スキームは実際のアプリケーション環境ではうまく機能しますが、同時処理はサポートされていません。メールボックス データを変更できるのは一度に 1 つのプロセスだけであるため、これは大容量のメールボックス システムでは問題になります。

読み書きロック

メールボックスからデータを読み込む際にはそのようなトラブルはなく、複数のユーザーが同時に読み込んでも問題ありません。読み取りによってデータが変更されないため、エラーは発生しません。しかし、別のユーザーが電子メール番号 25 を削除しようとしているときに、顧客がメールボックスを読んでいるとどうなるでしょうか?結論は不確かです。読み取りクライアントがエラーで終了するか、一貫したメールボックス データを読み取ることができない可能性があります。したがって、セキュリティ上の理由から、メールボックスを読み取る場合でも特別な注意が必要です。

上記のメールボックスをデータベース内のテーブルとして扱い、電子メールをテーブル内の行として扱うと、同じ問題が依然として存在することが簡単にわかります。多くの点で、メールボックスは単純なデータベース テーブルです。データベース テーブル内のレコードの変更は、メールボックス内の電子メール情報の削除または変更と非常に似ています。

この種の古典的な問題の解決策は、同時実行制御 (読み取りロックと書き込みロック) です。実際、同時読み取りまたは書き込みを処理する場合、2 種類のロックで構成されるロック システムを実装することで問題を解決できます。これら 2 種類のロックは、共有ロック および 排他ロック と呼ばれることが多く、読み取りロック および 書き込みロック とも呼ばれます。

ここでは実装方法については説明しません。ロックの概念を次のように説明しましょう。読み取りロックは共有される、つまり相互にブロックされません。複数のクライアントは、互いに干渉することなく、同時に同じリソースを読み取ることができます。書き込みロックは排他的です。つまり、書き込みロックは他の書き込みロックと読み取りロックをブロックします。これは、この方法でのみ、一度に 1 人のユーザーのみが書き込みを実行できるようにするためです。他のユーザーが書き込まれている同じリソースを読み取ることができないようにします。

実際のデータベース システムでは、ユーザーがデータの特定の部分を変更すると、MySQL はロックによって他のユーザーが同じデータを読み取ることができないようにします。ほとんどの場合、MySQL ロックの内部管理は透過的です。

ロックの粒度

共有リソースで同時実行性を提供する 1 つの方法は、ロック オブジェクトをより選択的にすることです。すべてのリソースではなく、変更する必要があるデータの一部のみをロックするようにしてください。より理想的なアプローチは、変更されるデータ部分のみを正確にロックする (具体的には、変更されたフィールドをロックする) ことです。常に、特定のリソース上で、相互に競合がない限り、ロックされるデータの量が少ないほど、システムの同時実行性は高くなります。

問題は、ロックによってもリソースが消費されることです。ロックの取得、ロックが解除されているかどうかの確認、ロックの解除などのさまざまなロック操作により、システムのオーバーヘッドが増加します。システムがデータにアクセスする代わりにロックの管理に多くの時間を費やすと、システムのパフォーマンスが低下する可能性があります。

いわゆるロック戦略は、ロックのコストとデータのセキュリティの間のバランスを追求することです。このバランスは、通常、テーブルに追加のオプションを提供しません。レベルのロックを管理し、ロックが多数ある場合に最高のパフォーマンスを提供するために、さまざまな複雑な方法でそれらを実装します。

MySQL にはさまざまなオプションが用意されており、各 MySQL ストレージ エンジンは独自のロック戦略とロック粒度を実装できます。ロック管理は、ストレージ エンジンの設計において非常に重要な決定です。ロック粒度を特定のレベルに固定すると、特定のアプリケーション シナリオのパフォーマンスが向上します。しかし、同僚は他のアプリケーション シナリオに対する優れたサポートを失うことになります。幸いなことに、MySQL は複数のストレージ エンジン アーキテクチャをサポートしているため、単一の汎用ソリューションは必要ありません。最も重要な 2 つのロック戦略を以下に紹介します。

テーブルロック(テーブルロック)

テーブルロックはMySQLにおける最も基本的なロック戦略であり、最もオーバーヘッドの少ない戦略です。テーブルのロックは、前に説明したメールボックスのロック メカニズムと非常によく似ており、テーブル全体をロックします。ユーザーがテーブルに対して書き込み操作 (挿入、削除、更新など) を実行するには、書き込みロックを取得する必要があります。これにより、他のユーザーによるテーブルに対するすべての読み取りおよび書き込み操作がブロックされます。書き込みロックがない場合にのみ、他の読み取りユーザーが読み取りロックを取得でき、読み取りロックは相互にブロックしません。

特定のシナリオでは、テーブル ロックも優れたパフォーマンスを発揮する可能性があります。たとえば、読み取りローカル テーブル ロックは、特定の種類の同時書き込み操作をサポートします。さらに、書き込みロックは読み取りロックよりも優先度が高いため、書き込みロック要求は読み取りロック キューの前に挿入される場合があります (書き込みロックはロック キュー内の読み取りロックの前に挿入できますが、読み取りロックは読み取りロック キューの前に挿入される可能性があります)。ロックは挿入できません) を書き込みロックの前に挿入します)。

ストレージ エンジンは独自のロックを管理できますが、Mysql 自体は依然としてさまざまな目的を達成するためにさまざまな効果的なテーブル ロックを使用しています。たとえば、サーバーはストレージ エンジンのロック メカニズムを無視して、alter table などのステートメントにテーブル ロックを使用します。

[注: ロック メカニズムはストレージ エンジンによって管理されますが、MySQL 自体がこのロック メカニズムを強制的に管理する場合があります]

行ロック (行ロック)

行レベルのロックは、最大限の程度まで同時処理をサポートできます (同時に最大のロックオーバーヘッドももたらします)。行レベルのロックが InnoDB と XtraDB、およびその他のストレージ エンジンに実装されていることはよく知られています。 行レベルのロックはストレージ エンジン レイヤーでのみ実装されます、MySQL サーバー レイヤー (必要に応じて、前の記事の論理アーキテクチャ図を確認してください) は実装されていません。サーバー層は、ストレージ エンジンのロック実装についての情報を持ちません。この章と本書全体を通して、すべてのストレージ エンジンは独自の方法でロック メカニズムを示しています

同時にデータを変更する必要があるクエリが複数ある場合、同時実行制御の問題が発生します。ここでは、サーバー層とストレージ エンジン層の 2 つのレベルでの MySQL の同時実行制御について説明します。同時実行制御は大きなテーマであり、それについて詳しく説明した理論文献が大量にあります。ここでは、MySQL が同時読み取りと書き込みをどのように制御するかについて簡単に説明するだけです。

UNIX システムの電子メール ボックスを例に挙げます。典型的な mbox ファイル形式は非常に単純です。 mbox メールボックス内のすべての電子メールは一緒にシリアル化され、エンドツーエンドで接続されます。この形式は、Feixi の電子メール情報を読むのに非常に使いやすく、ファイルの末尾に新しい電子メールのコンテンツを追加するだけで電子メールを配信することも簡単です。

しかし、2 つのプロセスが同時に同じメールボックスにメールを配信するとどうなるでしょうか?明らかに、メールボックス内のデータは破棄され、2 つの電子メールの内容がメールボックス ファイルの末尾に追加されます。適切に設計されたメールボックス配信システムでは、ロックを使用してデータの破損を防ぎます。顧客がメールを配信しようとして、メールボックスが別の顧客によってロックされている場合、配信が行われる前にロックが解除されるまで待つ必要があります。

このロック ソリューションは実際のアプリケーション環境ではうまく機能しますが、同時処理はサポートされていません。メールボックス データを変更できるのは一度に 1 つのプロセスだけであるため、これは大容量のメールボックス システムでは問題になります。

読み書きロック

メールボックスからデータを読み込む際にはそのようなトラブルはなく、複数のユーザーが同時に読み込んでも問題ありません。読み取りによってデータが変更されないため、エラーは発生しません。しかし、別のユーザーが電子メール番号 25 を削除しようとしているときに、顧客がメールボックスを読んでいるとどうなるでしょうか?結論は不確かです。読み取りクライアントがエラーで終了するか、一貫したメールボックス データを読み取ることができない可能性があります。したがって、セキュリティ上の理由から、メールボックスを読み取る場合でも特別な注意が必要です。

上記のメールボックスをデータベース内のテーブルとして扱い、電子メールをテーブル内の行として扱うと、同じ問題が依然として存在することが簡単にわかります。多くの点で、メールボックスは単純なデータベース テーブルです。データベース テーブル内のレコードの変更は、メールボックス内の電子メール情報の削除または変更と非常に似ています。

この種の古典的な問題の解決策は、同時実行制御 (読み取りロックと書き込みロック) です。実際、同時読み取りまたは書き込みを処理する場合、2 種類のロックで構成されるロック システムを実装することで問題を解決できます。これら 2 種類のロックは、共有ロック および 排他ロック と呼ばれることが多く、読み取りロック および 書き込みロック とも呼ばれます。

ここでは実装方法については説明しません。ロックの概念を次のように説明しましょう。読み取りロックは共有される、つまり相互にブロックされません。複数のクライアントは、相互に干渉することなく、同時に同じリソースを読み取ることができます。書き込みロックは排他的です。つまり、書き込みロックは他の書き込みロックと読み取りロックをブロックします。これは、この方法でのみ、一度に 1 人のユーザーのみが書き込みを実行できるようにするためです。他のユーザーが書き込まれている同じリソースを読み取ることができないようにします。

実際のデータベース システムでは、ユーザーがデータの特定の部分を変更するたびにロックが発生し、MySQL はロックによって他のユーザーが同じデータを読み取ることができなくなります。ほとんどの場合、MySQL ロックの内部管理は透過的です。

ロックの粒度

共有リソースで同時実行性を提供する 1 つの方法は、ロック オブジェクトをより選択的にすることです。すべてのリソースではなく、変更する必要があるデータの一部のみをロックするようにしてください。より理想的なアプローチは、変更されるデータ部分のみを正確にロックする (具体的には、変更されたフィールドをロックする) ことです。常に、特定のリソース上で、相互に競合がない限り、ロックされるデータの量が少ないほど、システムの同時実行性は高くなります。

問題は、ロックによってもリソースが消費されることです。ロックの取得、ロックが解除されているかどうかの確認、ロックの解除などのさまざまなロック操作により、システムのオーバーヘッドが増加します。システムがデータにアクセスする代わりにロックの管理に多くの時間を費やすと、システムのパフォーマンスが低下する可能性があります。

いわゆるロック戦略は、ロックのコストとデータのセキュリティの間のバランスを追求することです。このバランスは、通常、テーブルに追加のオプションを提供しません。レベルのロックを管理し、ロックが多数ある場合に最高のパフォーマンスを提供するために、さまざまな複雑な方法でそれらを実装します。

MySQL にはさまざまなオプションが用意されており、各 MySQL ストレージ エンジンは独自のロック戦略とロック粒度を実装できます。ロック管理は、ストレージ エンジンの設計において非常に重要な決定です。ロック粒度を特定のレベルに固定すると、特定のアプリケーション シナリオのパフォーマンスが向上します。しかし、同僚は他のアプリケーション シナリオに対する優れたサポートを失うことになります。幸いなことに、MySQL は複数のストレージ エンジン アーキテクチャをサポートしているため、単一の汎用ソリューションは必要ありません。最も重要な 2 つのロック戦略を以下に紹介します。

テーブルロック(テーブルロック)

テーブルロックはMySQLにおける最も基本的なロック戦略であり、最もオーバーヘッドの少ない戦略です。テーブルのロックは、前に説明したメールボックスのロック メカニズムと非常によく似ており、テーブル全体をロックします。ユーザーがテーブルに対して書き込み操作 (挿入、削除、更新など) を実行するには、書き込みロックを取得する必要があります。これにより、他のユーザーによるテーブルに対するすべての読み取りおよび書き込み操作がブロックされます。書き込みロックがない場合にのみ、他の読み取りユーザーが読み取りロックを取得でき、読み取りロックは相互にブロックしません。

特定のシナリオでは、テーブル ロックも優れたパフォーマンスを発揮する可能性があります。たとえば、読み取りローカル テーブル ロックは、特定の種類の同時書き込み操作をサポートします。さらに、書き込みロックは読み取りロックよりも優先度が高いため、書き込みロック要求は読み取りロック キューの前に挿入される場合があります (書き込みロックはロック キュー内の読み取りロックの前に挿入できますが、読み取りロックは読み取りロック キューの前に挿入される可能性があります)。ロックは挿入できません) を書き込みロックの前に挿入します)。

ストレージ エンジンは独自のロックを管理できますが、Mysql 自体は依然としてさまざまな目的を達成するためにさまざまな効果的なテーブル ロックを使用しています。たとえば、サーバーはストレージ エンジンのロック メカニズムを無視して、alter table などのステートメントにテーブル ロックを使用します。

[注: ロック メカニズムはストレージ エンジンによって管理されますが、MySQL 自体がこのロック メカニズムを強制的に管理する場合があります]

行ロック (行ロック)

行レベルのロックは、最大限の程度まで同時処理をサポートできます (同時に最大のロックオーバーヘッドももたらします)。行レベルのロックが InnoDB と XtraDB、およびその他のストレージ エンジンに実装されていることはよく知られています。 行レベルのロックはストレージ エンジン レイヤーでのみ実装されます、MySQL サーバー レイヤー (必要に応じて、前の記事の論理アーキテクチャ図を確認してください) は実装されていません。サーバー層は、ストレージ エンジンのロック実装についての情報を持ちません。この章と本書全体を通して、すべてのストレージ エンジンは独自の方法でロック メカニズムを示しています

上記は [MySQL] 同時実行制御の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

phpmyadminを開く方法 phpmyadminを開く方法 Apr 10, 2025 pm 10:51 PM

次の手順でphpmyadminを開くことができます。1。ウェブサイトコントロールパネルにログインします。 2。phpmyadminアイコンを見つけてクリックします。 3。MySQL資格情報を入力します。 4.「ログイン」をクリックします。

MySQL:世界で最も人気のあるデータベースの紹介 MySQL:世界で最も人気のあるデータベースの紹介 Apr 12, 2025 am 12:18 AM

MySQLはオープンソースのリレーショナルデータベース管理システムであり、主にデータを迅速かつ確実に保存および取得するために使用されます。その実用的な原則には、クライアントリクエスト、クエリ解像度、クエリの実行、返品結果が含まれます。使用法の例には、テーブルの作成、データの挿入とクエリ、および参加操作などの高度な機能が含まれます。一般的なエラーには、SQL構文、データ型、およびアクセス許可、および最適化の提案には、インデックスの使用、最適化されたクエリ、およびテーブルの分割が含まれます。

MySQLの場所:データベースとプログラミング MySQLの場所:データベースとプログラミング Apr 13, 2025 am 12:18 AM

データベースとプログラミングにおけるMySQLの位置は非常に重要です。これは、さまざまなアプリケーションシナリオで広く使用されているオープンソースのリレーショナルデータベース管理システムです。 1)MySQLは、効率的なデータストレージ、組織、および検索機能を提供し、Web、モバイル、およびエンタープライズレベルのシステムをサポートします。 2)クライアントサーバーアーキテクチャを使用し、複数のストレージエンジンとインデックスの最適化をサポートします。 3)基本的な使用には、テーブルの作成とデータの挿入が含まれ、高度な使用法にはマルチテーブル結合と複雑なクエリが含まれます。 4)SQL構文エラーやパフォーマンスの問題などのよくある質問は、説明コマンドとスロークエリログを介してデバッグできます。 5)パフォーマンス最適化方法には、インデックスの合理的な使用、最適化されたクエリ、およびキャッシュの使用が含まれます。ベストプラクティスには、トランザクションと準備された星の使用が含まれます

なぜMySQLを使用するのですか?利点と利点 なぜMySQLを使用するのですか?利点と利点 Apr 12, 2025 am 12:17 AM

MySQLは、そのパフォーマンス、信頼性、使いやすさ、コミュニティサポートに選択されています。 1.MYSQLは、複数のデータ型と高度なクエリ操作をサポートし、効率的なデータストレージおよび検索機能を提供します。 2.クライアントサーバーアーキテクチャと複数のストレージエンジンを採用して、トランザクションとクエリの最適化をサポートします。 3.使いやすく、さまざまなオペレーティングシステムとプログラミング言語をサポートしています。 4.強力なコミュニティサポートを提供し、豊富なリソースとソリューションを提供します。

Apacheのデータベースに接続する方法 Apacheのデータベースに接続する方法 Apr 13, 2025 pm 01:03 PM

Apacheはデータベースに接続するには、次の手順が必要です。データベースドライバーをインストールします。 web.xmlファイルを構成して、接続プールを作成します。 JDBCデータソースを作成し、接続設定を指定します。 JDBC APIを使用して、接続の取得、ステートメントの作成、バインディングパラメーター、クエリまたは更新の実行、結果の処理など、Javaコードのデータベースにアクセスします。

DockerによるMySQLを開始する方法 DockerによるMySQLを開始する方法 Apr 15, 2025 pm 12:09 PM

DockerでMySQLを起動するプロセスは、次の手順で構成されています。MySQLイメージをプルしてコンテナを作成および起動し、ルートユーザーパスワードを設定し、ポート検証接続をマップしてデータベースを作成し、ユーザーはすべての権限をデータベースに付与します。

MySQLの役割:Webアプリケーションのデータベース MySQLの役割:Webアプリケーションのデータベース Apr 17, 2025 am 12:23 AM

WebアプリケーションにおけるMySQLの主な役割は、データを保存および管理することです。 1.MYSQLは、ユーザー情報、製品カタログ、トランザクションレコード、その他のデータを効率的に処理します。 2。SQLクエリを介して、開発者はデータベースから情報を抽出して動的なコンテンツを生成できます。 3.MYSQLは、クライアントサーバーモデルに基づいて機能し、許容可能なクエリ速度を確保します。

Centosはmysqlをインストールします Centosはmysqlをインストールします Apr 14, 2025 pm 08:09 PM

CentOSにMySQLをインストールするには、次の手順が含まれます。適切なMySQL Yumソースの追加。 yumを実行して、mysql-serverコマンドをインストールして、mysqlサーバーをインストールします。ルートユーザーパスワードの設定など、MySQL_SECURE_INSTALLATIONコマンドを使用して、セキュリティ設定を作成します。必要に応じてMySQL構成ファイルをカスタマイズします。 MySQLパラメーターを調整し、パフォーマンスのためにデータベースを最適化します。

See all articles