MySQLデータベースのロック機構の分析

MySQLデータベースのロック機構の分析

同時アクセスの場合、非反復読み取りやその他の読み取り現象が発生する可能性があります。高い同時実行性にうまく対処するために、ブロッキング、タイムスタンプ、楽観的同時実行性制御 (楽観的ロック)、および悲観的同時実行性制御 (悲観的ロック) が、同時実行性制御で使用される主な技術的方法です。

ロックの分類

①、操作別:DMLロック、DDLロック

②、ロック粒度別:テーブルレベルロック、行レベルロック、ページレベルロック

③. ロックレベルによる分類:共有ロック、排他ロック

④. 施錠方法による分類:自動ロック、ディスプレイロック

⑤. 用途による分類:楽観的ロック、悲観的ロック

楽観的ロックと悲観的ロック

同時実行制御では、楽観的同時実行制御と悲観的同時実行制御が主に使用されます。楽観的ロックと悲観的ロックはリレーショナル データベースで使用されるだけでなく、Hibernate、Memcache などにも関連する概念があります。

悲観的ロック: 悲観的同時実行制御、悲観的同時実行コントローラーとも呼ばれ、PCC と略されます。悲観的ロックとは、データ処理プロセス中にデータがロックされることを意味し、通常はデータベース ロック メカニズムを使用して実装されます。

注意: MySQL で悲観的ロックを使用するには、MySQL の自動コミットをオフにして、autocommit=0 を設定する必要があります。 MySQL はデフォルトで自動コミット モードを使用します。つまり、更新操作を実行すると、MySQL は結果を自動的にコミットします。

たとえば、select...for updateメソッドを使用してデータをロックし、排他ロックを有効にします。

//0. トランザクションを開始します begin;/begin work;/start transaction; (3 つのうち 1 つを選択します) //1. 製品情報を照会します select status from t_goods where id=1 for update;
//2. 製品情報に基づいて注文を生成する insert into t_orders (id,goods_id) values ​​(null,1);
//3. 商品のステータスを2に変更する
t_goods を更新し、status=2 を設定します。
//4. トランザクションをコミットする commit;/commit work;

悲観的ロック

利点: 悲観的ロックは、データベースのロック機構を使用してデータ変更の順次実行を実装します。これは最も効果的な方法です。

デメリット: ロック メカニズムにより追加のオーバーヘッドが発生し、デッドロックの可能性が高まります。トランザクションが悲観的ロックでデータをロックすると、他のトランザクションはクエリ以外の操作をロックされたデータに対して実行できなくなります。トランザクションの実行時間が非常に長い場合、他のトランザクションは常に待機する必要があり、システムのスループットに必然的に影響します。

楽観的ロック

利点: 楽観的ロックではデータベースがロックされません。どのトランザクションでもデータを操作でき、更新時にのみ検証が実行されます。これにより、悲観的ロックによってスループットが低下するという欠点を回避できます。

デメリット: 楽観的ロックは手動で実装されるため、自社の業務にしか適用できません。外部トランザクションが挿入されるとエラーが発生する可能性があります。

  • MySQL共通ストレージエンジンのロック機構
  • BDB: ページレベルロックとテーブルレベルロックをサポートし、ページレベルロックがデフォルトです。
  • InnoDB: 行レベルロックとテーブルレベルロックをサポートし、行レベルロックがデフォルトです。
  • MyISAMとメモリ: 両方のストレージエンジンはテーブルレベルのロックを使用します

MySQL の排他ロックと共有ロック

排他ロック

排他ロックは書き込みロックとも呼ばれます。トランザクション T が A に排他ロックを追加すると、他のトランザクションは A にいかなる種類のロックも追加できなくなります。排他ロックが付与されたトランザクションは、データの読み取りと書き込みの両方を行うことができます。

使用法: SELECT ... FOR UPDATE

共有ロック

共有ロックは読み取りロックとも呼ばれます。トランザクション T が A に共有ロックを追加した場合、他のトランザクションは A に共有ロックのみを追加でき、他のロックを追加することはできません。共有ロックが付与されたトランザクションは、データの読み取りのみ可能で、データの書き込みはできません。

使用法: SELECT ... LOCK IN SHARE MODE;

MySQL の行レベル ロック、テーブルレベル ロック、ページレベル ロック

行レベル ロック: 行レベル ロックは、共有ロックと排他ロックに分けられます。行レベル ロックは、MySQL で最もきめ細かいロックです。 InnoDB エンジンは、行レベルのロックとテーブルレベルのロックをサポートしています。行レベルのロックは、インデックス条件を通じてデータが取得される場合にのみ使用され、それ以外の場合はテーブルレベルのロックが使用されます。行レベルのロックは、オーバーヘッドが高く、ロックの追加が遅く、ロックの粒度が最小で、ロック競合の可能性が最も低く、同時実行性が最も高くなります。

テーブル レベル ロック: テーブル レベル ロックは、テーブル共有ロックとテーブル排他ロックに分けられます。テーブルレベルのロックは、オーバーヘッドが低く、ロックが高速で、ロックの粒度が大きく、ロックの競合が最も多く、同時実行性が最も低いという特徴があります。

ページ レベル ロック: ページ レベル ロックは、MySQL のロックの一種で、ロックの粒度は行レベル ロックとテーブル レベル ロックの中間です。テーブル レベルのロックは高速ですが競合が多く、行レベルのロックは競合が少ないですが低速です。したがって、隣接するレコードのグループを一度にロックするために、妥協的なページ レベルが採用されます。 BDB はページレベルのロックをサポートしています。

オーバーヘッドとロック時間はテーブルロックと行ロックの間であり、デッドロックが発生する可能性があります。ロックの粒度はテーブルロックと行ロックの間であり、同時実行性は平均的です。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL のロックの仕組みと使用法の分析
  • MySQL InnoDB のロック機構の詳細な説明
  • MySQLのロック機構の詳細な説明
  • MySQLの分離レベルとロックメカニズムの詳細な説明
  • MySQLのロック機構に関する最も包括的な説明

<<:  Linux の Docker コンテナで bash を終了する 2 つの方法

>>:  Vueはドラッグアンドドロップを使用して構造ツリーを作成します

推薦する

MySQLの関連ロックについての簡単な理解

この記事は主にInnoDBのロックに関する知識を素早く理解してもらうことを目的としています。 Roc...

HTML と CSS を使用して絵文字付きのコメント ボックスを作成する方法のチュートリアル

絵文字付きの HTML コメント ボックス。絵文字は Json データを通じて読み込まれ、好みに応じ...

CentOS7.x のアンインストールとインストール MySQL5.7 の操作手順とエンコード形式の変更方法

1. MySQL 5.7 のアンインストール1.1查看yum是否安裝過mysql CD yum li...

すべてのブラウザとの完全な互換性を実現するために最適なプリセットを選択してください

各ブラウザの select タグのプロパティと各ブラウザのサポートが多少異なるため、各ブラウザでの選...

CentOS7 ファイアウォールとポート関連コマンドの紹介

目次1. ファイアウォールの現在の状態を確認する2. ファイアウォールサービスを開始する3. ファイ...

MySQLの起動失敗の解決策

MySQLの起動失敗の解決策MySQLを起動できませんmysqlを停止した後、いくつかの操作(ホスト...

mysql インストーラ コミュニティ 8.0.16.0 のインストールと構成のグラフィック チュートリアル

mysqlインストーラコミュニティ8.0.16.0インストールグラフィックチュートリアル、参考までに...

MySQL でテーブル メタデータ ロックを待機する理由と方法

MySQL が alter table などの DDL 操作を実行すると、テーブル メタデータ ロッ...

Linux でシェル スクリプトを使用して jar パッケージ プロジェクトを展開するための完全な手順

1. JDKをインストールする コンピュータの動作桁を確認します。 uname -ar 2017 x...

MySQLデータベースのリアルタイムバックアップの知識ポイントを詳しく解説

序文リアルタイムのデータベース バックアップの必要性は非常に一般的です。MySQL 自体はレプリケー...

Linux で実行中のバックグラウンド プログラムを表示および終了する方法

Linux タスク管理 - バックグラウンド実行と終了fg、bg、ジョブ、&、ctrl + ...

コンテンツタイプの説明、つまりHTTPリクエストヘッダーのタイプ

コンテンツ タイプについて学ぶには、まずそれが何であるか、そして何に使用されるかを知る必要があります...

nginx で第 3 レベルドメイン名を設定する方法の例

問題の説明nginx を設定することで、異なるポートを介して異なる Web アプリケーションにアクセ...

インスタンス化されたオブジェクトパラメータによるMySQLクエリ例の説明

この記事では、オブジェクト パラメータをインスタンス化して MySQL でデータをクエリする方法を紹...

Docker を使用した Redis マスタースレーブレプリケーションの実践の詳細説明

目次1. 背景2. 操作手順3. Dockerをインストールする4. 主なサービス構成5. サービス...