MySQL 同時実行制御の原則
Mysql は、高性能のデータ ストレージ サービスを提供する主流のオープン ソース リレーショナル データベースです。バックエンド開発を行う場合、
パフォーマンスのボトルネックが発生することがありますが、これらのボトルネックはアプリケーション自体に起因するものではなく、データベース レベルに起因する場合があります。
したがって、Mysql の基礎となる原則のいくつかを習得することは、Mysql をより深く理解し、Mysql でパフォーマンス チューニングを実行し、
その結果、高パフォーマンスのバックエンド サービスを開発するのに役立ちます。
1. mysql の論理フレームワーク
mysql の論理フレームワーク図は次のとおりです:
最上位層クライアントを処理します。
主に接続処理、認可認証、セキュリティなどを行います。 Mysql は、クライアントからの接続を処理するために、この層でスレッド プールを維持します。 Mysql はユーザー名とパスワードの認証を使用できますが、 は SSL ベースの X.509 証明書認証も使用できます。2 番目の層は、クエリ キャッシュ、パーサー、オプティマイザーの 3 つの部分で構成されます。パーサーは SQL ステートメントの解析に使用され、オプティマイザーは解析されたステートメントを最適化します。 クエリを解析する前に、サーバーはまずクエリ キャッシュをチェックします。対応するクエリ結果がキャッシュ内に見つかった場合は、クエリの解析や最適化などを必要とせずに、クエリ結果が直接返されます。ストアド プロシージャ、トリガー、ビューなどはすべてこの層に実装されます。
3 番目の層はストレージ エンジンです。ストレージ エンジンは、MySQL へのデータの保存、データの抽出、トランザクションの開始などを担当します。ストレージ エンジンは、API を介して上位層と通信します。これらの API は、異なるストレージ エンジン間の差異を保護し、上位層のクエリ プロセスに対してこれらの差異を透過的にします。ストレージ エンジンは SQL を解析しません。 mysql で最も一般的に使用されるストレージ エンジンは InnoDB です。
2. mysql の同時実行制御複数のスレッドが同時にデータを操作すると、同時実行制御の問題が発生する可能性があります。
2-1. 読み取り/書き込みロック複数のスレッドがデータの読み取りのみを行う場合、実際には、相互に影響を与えることなく一緒にデータを読み取ることができます。共有ロックとも呼ばれる「読み取りロック」を使用します。
読み取りロックを取得したスレッドは互いにブロックせず、同時にリソースを読み取ることができます。
スレッドがデータを書き込む必要がある場合、「書き込みロック」を使用する必要があります。これは排他ロックにもなります。
書き込みロックは、書き込み操作が完了するまで他の書き込みロックと読み取りロックをブロックします。
2-2. ロックの粒度最初に概念を明確にします: 特定のリソース上で、ロックする必要があるデータが少ないほど、システムが実行できる同時実行性が高くなります。 . 高いほど。
ただし、ロックによってもリソースが消費されます。システムがデータへのアクセスではなくロックの管理に多くの時間を費やしている場合、
システムのパフォーマンスに影響が出る可能性があります。
したがって、優れた「ロック戦略」は、ロックのオーバーヘッドとデータ セキュリティの間のバランスを見つけることです。Mysql は複数のストレージ エンジン アーキテクチャをサポートしています。
各ストレージ エンジンには、独自のロック戦略を実装でき、ロックの粒度。
2-3. テーブル ロックと行ロックテーブル ロックは、その名前が示すように、テーブル全体をロックします。テーブルロックのオーバーヘッドは比較的小さいです。テーブルに書き込みロックを追加すると、他のユーザーによるテーブルに対するすべての読み取りおよび書き込み操作がブロックされます。
Mysql では、ストレージ エンジンが独自のロックを提供できますが、Mysql は ALTER TABLE などのステートメントなどのテーブル ロックを使用することがあります。
書き込みロックは読み取りロックよりも優先度が高いため、書き込みロック要求は読み取りロック キューの先頭に挿入される場合があります。
行レベルのロックは行全体をロックするため、同時処理を最大限にサポートできますが、ロック解除のコストも比較的高くなります。行レベルのロックは、ストレージ エンジン層でのみ実装されます。
すべてのストレージ エンジンは、独自の方法で行レベルのロックを実装します。
3. MVCCMVCC は「マルチバージョン同時実行制御」です。MVCC は行レベルのロックの一種であると考えることができますが、多くの場合、行レベルのロックの数を増やす必要があります。ロック操作、
なので、オーバーヘッドが低くなります。
主流のリレーショナル データベースはすべて MVCC を実装していますが、実装メカニズムは異なります。実際、MVCC には統一された標準がありません。
しかし、それらのほとんどはノンブロッキング読み取り操作を実装しており、書き込み操作は必要な行のみをロックします。
MVCC は、実行中の各トランザクションで表示されるデータの一貫性を保証します。
ただし、異なるトランザクションは異なるタイミングで開始されるため、同じテーブルに対して同時に表示されるデータは異なる可能性があります。
Mysql の InnoDB エンジンは、レコードの各行の背後に 2 つの非表示列を保存することによって実装されます。
1 つは行の作成時間を保存し、もう 1 つは行の有効期限 (または削除時間) を保存します。
実際には、保存されるのは実際のタイムスタンプではなく、「システムのバージョン番号」です。
トランザクションが開始されるたびに、システムのバージョン番号が増加します。トランザクションが開始されると、システムのバージョン番号がトランザクションのバージョン番号として使用され、クエリされた行のバージョン番号と比較するために使用されます。
次に、一般的な CRUD 操作でバージョン番号がどのように機能するかを紹介します。
INSERT現在のシステム バージョンを行バージョン番号として保存します
DELETE現在のシステムのバージョン番号をこのデータ行の「バージョンの削除」に保存します。 #########アップデート######
新しいレコード行を挿入し、現在のシステム バージョン番号をナビゲーション バージョン番号として保存し、現在のシステム バージョン番号を元の行の「削除バージョン」に保存します。
SELECT
現在のトランザクション バージョンより前のバージョンの行のみを検索します。これにより、トランザクションによって読み取られた行が
より前に存在していたか、トランザクション自体によって挿入または変更されたことが保証されます。行
の「削除バージョン」は未定義であるか、現在のトランザクションのバージョン番号より大きいです。これにより、トランザクションによって読み取られた行がトランザクションの前に削除されていないことが保証されます。
MVCC は、
REPEATABLE READ と READ COMMITTED
の 2 つの分離レベルでのみ機能し、他の 2 つの分離レベルは機能しません。
は、現在のトランザクション バージョンに一致するデータ行ではなく、常に最新のデータを読み取るためです。そして SERIALIZABLE
は読み取られたすべての行をロックします。 上記は同時実行制御に関するいくつかの問題をまとめたものです。その他の関連する問題については、PHP 中国語 Web サイトの関連チュートリアルを参照してください。
推奨ビデオチュートリアル:
https://www.php.cn/course/list/51/type/2.html以上がMySQL 同時実行制御の原則の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









Java コレクション フレームワークは、スレッドセーフなコレクションと同時実行制御メカニズムを通じて同時実行を管理します。スレッドセーフなコレクション (CopyOnWriteArrayList など) はデータの一貫性を保証しますが、非スレッドセーフなコレクション (ArrayList など) は外部同期を必要とします。 Java は、ロック、アトミック操作、ConcurrentHashMap、CopyOnWriteArrayList などのメカニズムを提供して同時実行性を制御し、それによってマルチスレッド環境でのデータの整合性と一貫性を確保します。

C# 開発では、増大するデータとタスクに直面して、マルチスレッド プログラミングと同時実行制御が特に重要です。この記事では、C#開発で注意すべき点をマルチスレッドプログラミングと同時実行制御の2つの側面から紹介します。 1. マルチスレッドプログラミング マルチスレッドプログラミングとは、CPU のマルチコアリソースを利用してプログラムの効率を向上させる技術です。 C# プログラムでは、Thread クラス、ThreadPool クラス、Task クラス、Async/Await を使用してマルチスレッド プログラミングを実装できます。しかし、マルチスレッドプログラミングを行う場合、

同時プログラミングは、Goroutine と同時実行制御ツール (WaitGroup、Mutex など) を介して Go に実装されており、サードパーティのライブラリ (sync.Pool、sync.semaphore、queue など) を使用してその機能を拡張できます。これらのライブラリは、タスク管理、リソース アクセス制限、コード効率の向上などの同時操作を最適化します。キュー ライブラリを使用してタスクを処理する例では、実際の同時実行シナリオでのサードパーティ ライブラリのアプリケーションを示します。

Go 言語における http.Transport の同時実行制御戦略とパフォーマンス最適化手法 Go 言語では、http.Transport を使用して HTTP リクエスト クライアントを作成および管理できます。 http.Transport は Go の標準ライブラリで広く使用されており、多くの構成可能なパラメータと同時実行制御関数を提供します。この記事では、http.Transport の同時実行制御戦略を使用してパフォーマンスを最適化する方法について説明し、実際に動作するサンプル コードをいくつか示します。 1つ、

GoLang のパフォーマンスに対する同時実行制御の影響: メモリ消費: Goroutine は追加のメモリを消費し、多数の Goroutine がメモリ枯渇を引き起こす可能性があります。スケジューリングのオーバーヘッド: ゴルーチンの作成によりスケジューリングのオーバーヘッドが発生し、ゴルーチンの頻繁な作成と破棄はパフォーマンスに影響します。ロックの競合: 複数のゴルーチンが共有リソースにアクセスする場合、ロックの同期が必要です。ロックの競合により、パフォーマンスが低下し、遅延が長くなります。最適化戦略: ゴルーチンを正しく使用します。必要な場合にのみゴルーチンを作成します。 goroutine の数を制限します。同時実行性を管理するには、channel または sync.WaitGroup を使用します。ロックの競合を回避します: ロックのないデータ構造を使用するか、ロックの保持時間を最小限に抑えます。

MySQL で分散ロックを使用して同時アクセスを制御するにはどうすればよいですか?データベース システムでは、同時アクセスが多いことが一般的な問題であり、分散ロックは一般的な解決策の 1 つです。この記事では、MySQL で分散ロックを使用して同時アクセスを制御する方法を紹介し、対応するコード例を示します。 1. 原則 分散ロックを使用すると、共有リソースを保護し、同時に 1 つのスレッドだけがリソースにアクセスできるようにすることができます。 MySQL では、分散ロックは次の方法で実装できます。 lock_tabl という名前のファイルを作成します。

MySQL と Oracle: マルチバージョン同時実行制御とデータ整合性のサポートの比較 はじめに: 今日のデータ集約型アプリケーションでは、データベース システムがデータのストレージと管理を実現する上で中心的な役割を果たしています。 MySQL と Oracle は、エンタープライズ レベルのアプリケーションで広く使用されている 2 つのよく知られたリレーショナル データベース管理システム (RDBMS) です。マルチユーザー環境では、データの一貫性の確保と同時実行性の制御がデータベース システムの重要な機能です。この記事では、MySQL と Oracle の間でマルチバージョンの同時実行制御とデータを共有します。

MySQL 分散トランザクション処理および同時実行制御プロジェクトの経験の分析 近年、インターネットの急速な発展とユーザー数の増加に伴い、データベースに対する要件も増加しています。大規模な分散システムでは、MySQL は最も一般的に使用されるリレーショナル データベース管理システムの 1 つとして、常に重要な役割を果たしてきました。ただし、データ サイズが増大し、同時アクセスが増加するにつれて、MySQL のパフォーマンスとスケーラビリティは深刻な課題に直面しています。特に分散環境では、トランザクションを処理し、同時実行性を制御する方法が緊急に解決する必要があります。
