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はドラッグアンドドロップを使用して構造ツリーを作成します

推薦する

複数の .sql ファイルを MySQL に効率的にインポートする方法の詳細な説明

MySQL には、複数の .sql ファイル (SQL ステートメントを含む) をインポートする方法...

ウェブデザインのためのオンライン開発ツール10選の紹介

1. オンラインテキストジェネレーターBlindTextGenerator: デザイナーにとって、こ...

Vue が価格カレンダー効果を実現

この記事では、価格カレンダー効果を実現するためのVueの具体的なコードを例として紹介します。具体的な...

mysql-joinsの具体的な使用方法

目次結合構文: 1. InnerJOIN: (内部結合) 2. LeftJOIN: (左結合) 3....

MySqlのインストールとログインの詳細な説明

LinuxにMySQLがすでにインストールされているかどうかを確認する sudo service m...

ウェブページのFOUC問題によるウェブページの混乱の解決策

FOUC は Flash of Unstyled Content の略で、FOUC と略されます。簡...

Vue Element フロントエンドアプリケーション開発のための従来の JS 処理機能

目次1. 従来のコレクションに対するフィルター、マップ、および削減処理方法2. 再帰処理3. for...

WeChat アプレット計算機の例

WeChatアプレット計算機の例、参考までに、具体的な内容は次のとおりです。インデックス.wxml ...

MySQLデータベースのnullに関する知識ポイントのまとめ

MySQL データベースでは、null は一般的な状況です。MySQL での null に関する注意...

Bootstrap 3.0 学習ノート グリッドシステム事例

序文前回の記事では、主にグリッドシステムの基本原理を学び、簡単なケースを通してその原理を実践しました...

CentOS 7 に MySQL 8.0.20 データベースをインストールするための詳細なチュートリアル

関連記事: MySQL8.0.20 インストール チュートリアルとインストールの問題に関する詳細なチ...

HTML タグ tbody の使い方と説明

tbody 要素は、thead 要素および tfoot 要素と組み合わせて使用​​する必要があります...

Puppeteer を使用して Linux (CentOS) で Web ページのスクリーンショット機能を実装する

Linux に puppeteer をインストールするときに、次の問題が発生する可能性があります。こ...

Ubuntu 18.04 で SSH サービスをインストールして設定する方法

sshツールをインストールする1. ターミナルを開き、次のコマンドを入力します。 apt-getアッ...

モバイル端末の適応により、px は自動的に rem に変換されます。

まずpostcss-pxtoremをインストールします: npm install postcss-p...