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

推薦する

DOM操作テーブルの例(DOMはテーブルを作成します)

1. HTML タグを使用してテーブルを作成します。コードをコピーコードは次のとおりです。 <...

nginxで複数のサーバーを簡単に構成する方法

1: nginx のインストール方法については詳しく説明しません。Baidu で検索してください。 ...

MySQL クエリ ステートメントのプロセスと EXPLAIN ステートメントの基本概念とその最適化

ウェブサイトやサービスのパフォーマンスは、データベースの設計(適切な言語開発フレームワークを選択した...

MySQL データベース アーキテクチャの詳細

目次1. MySQL アーキテクチャ2. ネットワーク接続層3. データベースサービス層4. 接続プ...

Vue が Ref を使用してレベル間でコンポーネントを取得する手順

VueはRefを使用してレベル間でコンポーネントインスタンスを取得します例の紹介開発プロセスでは、レ...

NodeはMySQLに接続し、追加、削除、変更、チェックのための実装コードをカプセル化します。

目次ノードはMysqlに接続しますMySQLモジュールをインストールするMySQLに接続するよく使わ...

ボタンの権限判定を実装するためのVueカスタムv-has命令

アプリケーションシナリオバックグラウンド管理システムを例にとると、各ユーザーには異なるボタン権限があ...

MySQL LOAD_FILE() 関数メソッドの概要

MySQL では、LOAD_FILE() 関数はファイルを読み取り、その内容を文字列として返します。...

W3C チュートリアル (7): W3C XSL アクティビティ

スタイル シートは、ドキュメントの表示方法、発音方法、または入力方法を記述します。XSL 言語は、X...

Meituan DBデータをデータウェアハウスに同期するアーキテクチャと実践

背景データ ウェアハウス モデリングでは、何ら処理されていない元のビジネス レイヤー データは OD...

JS における ES6 継承と ES5 継承の違い

目次継承ES5 プロトタイプ継承ES6 クラス継承両者の違いES5プロトタイプ継承の内部実装ES6 ...

MySQLストレージエンジンについて学びましょう

目次序文1. MySQL メインストレージエンジン: 2. さまざまなストレージエンジンがテーブルを...

HTMLおよびJSPページがキャッシュされ、Webサーバーから再取得されるのを防ぎます。

ユーザーがログアウトした後、ブラウザの戻るボタンがクリックされると、Web アプリケーションは保護さ...

Reactのようなフレームワークをゼロから作成する

最近、インターネットで「Build your own React」という記事を見ました。著者は、シン...

MySQL学習データベース検索文DQL小百章

目次1. データの簡単な取得2. データの並べ替えと取得2.1. 基本構文2.2. ソート方向を指定...