MySQL における悲観的ロックと楽観的ロック

MySQL における悲観的ロックと楽観的ロック

リレーショナル データベースでは、悲観的ロックと楽観的ロックがリソース同時実行シナリオのソリューションです。次に、これら 2 つの同時実行ソリューションの実際の使用法と利点と欠点について詳しく説明します。

まず、データベースを定義し、次のように単純な在庫テーブルを作成します。

テーブル「order_stock」を作成します(
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
 `oid` int(50) NOT NULL COMMENT '製品ID',
 `quantity` int(20) NOT NULL COMMENT '在庫',
 主キー (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 デフォルト CHARSET=utf8;

数量は、さまざまな商品 oid の在庫を表します。次に、OCC と PCC は、このデータベースをデモンストレーションに使用します。

楽観的ロック (OCC)

複数ユーザーの同時トランザクションは処理中に互いに影響を及ぼさず、各トランザクションはロックを生成せずに影響を受けるデータの一部を処理できることを前提としています。データの更新をコミットする前に、各トランザクションはまず、他のトランザクションがデータを読み取った後にそのデータを変更したかどうかを確認します。他のトランザクションに更新がある場合、コミットされているトランザクションはロールバックされます。

つまり、「楽観的ロック🔒」では、ロックを取得したユーザーが成功する可能性が高いと判断されるため、実際にデータの更新が必要な業務操作の最後のステップでロックを取得すれば十分です。これにより、データベース自体によって定義された行ロックの使用を回避し、デッドロックを回避できます。

order_stock を更新し、 quantity = quantity - 1 を設定します。 WHERE oid = 1 かつ quantity - 1 > 0 です。

楽観的同時実行制御は、データの競合や衝突がほとんどない環境で主に使用されます。このような環境では、トランザクションを時々ロールバックするコストは、データを読み取るときにデータをロックするコストよりも低いため、他の同時実行制御方法よりも高いスループットを実現できます。

悲観的ロック PCC

トランザクションが他のユーザーに影響を与えるような方法でデータを変更することを防ぎます。トランザクションがデータ行を読み取ってロックを適用する操作を実行する場合、そのトランザクションがロックを解除すると、他のトランザクションはロックと競合する操作のみを実行できるようになります。

この設計では、「1 つのロック 🔒 2 つのクエリ 🔍 3 つの更新」モードを採用しており、データベース内のselect ... for updateキーワードを使用して、現在のトランザクションに行レベルのロック 🔒 を追加し、最初に操作対象のデータをロックしてから、対応するクエリ データを実行して更新操作を実行します。

始める
order_stock から quantity を選択し、 oid = 1 で UPDATE を実行します。
order_stock を更新し、 quantity = 2 を設定します。 WHERE oid = 1; 
専念;

MySQL のもう 1 つの問題は、select ... for update ステートメントの実行中にスキャンされたすべての行がロックされ、簡単に問題が発生する可能性があることです。したがって、MySQL で悲観的ロックを使用する場合は、テーブル全体のスキャンではなくインデックスを使用するようにしてください。

悲観的同時実行制御は、データの競合が激しい環境や、同時実行の競合が発生したときにロックを使用してデータを保護するためのコストがトランザクションのロールバックのコストよりも低い環境で主に使用されます。

OCCとPCCの長所と短所

OCC の利点と欠点

【アドバンテージ】

  • 楽観的ロックでは、トランザクション間のデータ競合の可能性は比較的小さいと考えられるため、直接処理を進め、コミット時にのみロックすることができ、ロックやデッドロックは発生しません。
  • トランザクションに迅速に応答できますが、同時実行性が高まると、大量のロールバックが発生します。
  • 効率は高いが、ロック力を制御する必要がある。

【欠点】

  • これを単純に実行すると、予期しない結果が発生する可能性があります。たとえば、2 つのトランザクションが両方ともデータベースから行を読み取り、変更後にそれをデータベースに書き戻すと、問題が発生します。
  • 同時実行性が増加すると、多数のロールバックが発生します。

PCC の利点と欠点

【アドバンテージ】

「最初にロックしてからアクセスする」という保守的な戦略により、データ処理のセキュリティが確保されます。

【欠点】

  • 非効率的なデータベース ロックに依存している。
  • ロック メカニズムにより、データベースに追加のオーバーヘッドが発生し、デッドロックの可能性が高まります。
  • これにより、並列処理が減少します。トランザクションがデータ行をロックすると、他のトランザクションはそのデータ行を処理する前に、そのトランザクションが完了するまで待機する必要があります。

上記は、MySQL における悲観的ロックと楽観的ロックの詳細です。MySQL の悲観的ロックと楽観的ロックの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL における楽観的ロックと悲観的ロックの例
  • MySQL の悲観的ロックと楽観的ロックの使用例
  • MySQL の悲観的ロックと楽観的ロックの理解と応用分析
  • MySQL における楽観的ロック、悲観的ロック、MVCC の包括的な分析
  • MySQL 悲観的ロックと楽観的ロックの実装

<<:  Linux でメモリ使用量を確認する方法

>>:  子コンポーネントを通じて親コンポーネントのプロパティを変更するための Vue のさまざまな実装方法

推薦する

Vueのシンプルな状態管理ストアモードを理解する方法

目次概要1. store.jsを定義する2. store.js を使用するコンポーネント3. 成果を...

HTMLテーブルレイアウトの実践的な使い方の詳しい説明

テーブルはいつ使用されますか?最近では、Web ページの全体的なレイアウトにテーブルが使用されること...

UbuntuでGRUBの起動時間を変更する

grubの起動時間を変更するためのオンライン検索は基本的に/etc/default/grubを変更す...

Dockerにおけるコンテナとイメージの違いについてお話ししましょう

鏡とは何ですか?イメージは、複数のイメージ レイヤー (UnionFS および AUFS ファイル ...

英語のシングルクォーテーション「''」を含むSQLの記述の失敗について徹底解説

問題が発生しました。情報の編集をテストする際、編集した内容に一重引用符 (') が含まれてい...

AngularとIonicのライフサイクルとフック関数を素早く理解するための記事

目次角度成し遂げる呼び出し順序知らせイオニックionic はページのライフサイクルをどのように処理し...

WeChat アプレット開発フォーム検証 WxValidate の使用

個人的には、WeChat アプレットの開発フレームワークは VUE と概ね似ていると感じていますが、...

異なるブラウザ間で互換性のあるテキスト配置を実現する CSS

フォームのフロントエンド レイアウトでは、テキスト ボックスのプロンプト テキストを両端に揃える必要...

Linux カーネルの探究: Kconfig の秘密

Linux 構成/ビルド システムがどのように機能するかを深く理解します。 Linux カーネル構成...

Reactはグローバル箇条書きボックスメソッドをカプセル化します

この記事の例では、Reactカプセル化グローバルポップアップボックスの具体的なコードを参考までに共有...

Node.js の非同期ジェネレータと非同期反復の詳細な説明

序文ジェネレーター関数は、async/await が導入される前から JavaScript に存在し...

Vue の echarts ツールチップにクリック イベントを追加する詳細な説明

目次必要回避策1. ツールチップを設定する2. hookToolTip変数を定義する3. メソッド内...

VMware での Ubuntu 16.04 イメージの完全インストール チュートリアル

この記事では、VMware 12でのUbuntu 16.04イメージのインストールチュートリアルを参...