同時アクセスの場合、非反復読み取りやその他の読み取り現象が発生する可能性があります。高い同時実行性にうまく対処するために、ブロッキング、タイムスタンプ、楽観的同時実行性制御 (楽観的ロック)、および悲観的同時実行性制御 (悲観的ロック) が、同時実行性制御で使用される主な技術的方法です。 ロックの分類 ①、操作別: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 の排他ロックと共有ロック 排他ロック 排他ロックは書き込みロックとも呼ばれます。トランザクション T が A に排他ロックを追加すると、他のトランザクションは A にいかなる種類のロックも追加できなくなります。排他ロックが付与されたトランザクションは、データの読み取りと書き込みの両方を行うことができます。 使用法: SELECT ... FOR UPDATE 共有ロック 共有ロックは読み取りロックとも呼ばれます。トランザクション T が A に共有ロックを追加した場合、他のトランザクションは A に共有ロックのみを追加でき、他のロックを追加することはできません。共有ロックが付与されたトランザクションは、データの読み取りのみ可能で、データの書き込みはできません。 使用法: SELECT ... LOCK IN SHARE MODE; MySQL の行レベル ロック、テーブルレベル ロック、ページレベル ロック 行レベル ロック: 行レベル ロックは、共有ロックと排他ロックに分けられます。行レベル ロックは、MySQL で最もきめ細かいロックです。 InnoDB エンジンは、行レベルのロックとテーブルレベルのロックをサポートしています。行レベルのロックは、インデックス条件を通じてデータが取得される場合にのみ使用され、それ以外の場合はテーブルレベルのロックが使用されます。行レベルのロックは、オーバーヘッドが高く、ロックの追加が遅く、ロックの粒度が最小で、ロック競合の可能性が最も低く、同時実行性が最も高くなります。 テーブル レベル ロック: テーブル レベル ロックは、テーブル共有ロックとテーブル排他ロックに分けられます。テーブルレベルのロックは、オーバーヘッドが低く、ロックが高速で、ロックの粒度が大きく、ロックの競合が最も多く、同時実行性が最も低いという特徴があります。 ページ レベル ロック: ページ レベル ロックは、MySQL のロックの一種で、ロックの粒度は行レベル ロックとテーブル レベル ロックの中間です。テーブル レベルのロックは高速ですが競合が多く、行レベルのロックは競合が少ないですが低速です。したがって、隣接するレコードのグループを一度にロックするために、妥協的なページ レベルが採用されます。 BDB はページレベルのロックをサポートしています。 オーバーヘッドとロック時間はテーブルロックと行ロックの間であり、デッドロックが発生する可能性があります。ロックの粒度はテーブルロックと行ロックの間であり、同時実行性は平均的です。 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Linux の Docker コンテナで bash を終了する 2 つの方法
>>: Vueはドラッグアンドドロップを使用して構造ツリーを作成します
この記事は主にInnoDBのロックに関する知識を素早く理解してもらうことを目的としています。 Roc...
絵文字付きの HTML コメント ボックス。絵文字は Json データを通じて読み込まれ、好みに応じ...
1. MySQL 5.7 のアンインストール1.1查看yum是否安裝過mysql CD yum li...
各ブラウザの select タグのプロパティと各ブラウザのサポートが多少異なるため、各ブラウザでの選...
目次1. ファイアウォールの現在の状態を確認する2. ファイアウォールサービスを開始する3. ファイ...
MySQLの起動失敗の解決策MySQLを起動できませんmysqlを停止した後、いくつかの操作(ホスト...
mysqlインストーラコミュニティ8.0.16.0インストールグラフィックチュートリアル、参考までに...
MySQL が alter table などの DDL 操作を実行すると、テーブル メタデータ ロッ...
1. JDKをインストールする コンピュータの動作桁を確認します。 uname -ar 2017 x...
序文リアルタイムのデータベース バックアップの必要性は非常に一般的です。MySQL 自体はレプリケー...
Linux タスク管理 - バックグラウンド実行と終了fg、bg、ジョブ、&、ctrl + ...
コンテンツ タイプについて学ぶには、まずそれが何であるか、そして何に使用されるかを知る必要があります...
問題の説明nginx を設定することで、異なるポートを介して異なる Web アプリケーションにアクセ...
この記事では、オブジェクト パラメータをインスタンス化して MySQL でデータをクエリする方法を紹...
目次1. 背景2. 操作手順3. Dockerをインストールする4. 主なサービス構成5. サービス...