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 のさまざまな実装方法

推薦する

Linux で SSH 経由でリモート ファイルシステムをマウントする方法の詳細な説明

SSHFS の機能: FUSE(Linux向けの最高のユーザー空間ファイルシステムフレームワーク)を...

Vueはechart円グラフの凡例のパーセンテージを表示するメソッドを実装します

この記事では主に、echart を使用してパーセンテージを表示する Vue の円グラフデータ部分を紹...

操作タイムアウトがないときにMySQLサーバーがアクティブに切断される問題を解決します

MySQL サービスを使用する場合、通常の状況では、MySQL のタイムアウト設定は 8 時間 (2...

MySQL での coalesce() の使用に関するヒントのまとめ

序文最近、偶然 MySQL の coalesce を発見しました。ちょうど時間があったので、MySQ...

MySQL の起動時に InnoDB エンジンが無効になる問題の解決方法

問題を見つける今日、仕事中に、ローカル データベースから仮想マシン CentOS 6.6 上のデータ...

MySQLで適切なインデックスを選択する方法

まずは栗を見てみましょう EXPLAIN select * from employees where...

検索テキストボックスがフォーカスを外れたときにテキストの位置がジャンプする問題の解決方法

検索テキストボックスにテキストを設定すると、フォーカスを外すと位置がジャンプしますコードをコピーコー...

Web デザインにおける Less と More について語る (写真)

Less is More は多くのデザイナーのキャッチフレーズです。これは建築界の巨匠ルートヴィヒ...

VUEはトークンログイン認証を実装

この記事では、トークンログイン認証を実装するためのVUEの具体的なコードを例として紹介します。具体的...

背景属性の8つの属性値の詳細解説(面接の質問)

CSSの背景プロパティの値背景色背景画像背景繰り返し背景位置背景添付複合プロパティ: 背景: ba...

MySQL 8.0.16 圧縮パッケージのインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 8.0.16圧縮パッケージのインストールと設定方法を参考までに紹介します。...

HTML テーブルインライン形式の詳細な説明

インライン形式<colgroup>...</colgroup>属性名 属性値...

画面なしで無線ネットワークに接続しているときに Raspberry Pi の IP アドレスを見つける方法

あなたがlinuxerだと仮定すると、 windowserだとは想定しません。Windows ユーザ...

MySQL 5.6 の「暗黙的な変換」によりインデックスが失敗し、データが不正確になる

背景SQL クエリを実行するときに、where 条件の vachar 型フィールドの単一引用符を削除...

Vue フロントエンド開発における階層的にネストされたコンポーネント間の通信の詳細な説明

目次序文例まとめ序文Vue の親子コンポーネントは、props を通じて親コンポーネントの値を子コン...