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

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

データベース管理システムにおける同時実行制御のタスクは、データベース内の同じデータに同時にアクセスする複数のトランザクションが、トランザクションの分離性と統一性、およびデータベースの統一性を破壊しないようにすることです。

楽観的ロックと悲観的ロックの同時実行制御で使用される主な技術的手段

悲観的ロック

リレーショナル データベース管理システムでは、悲観的同時実行制御 (PCC) は同時実行制御の方法です。トランザクションが他のユーザーに影響を与えるような方法でデータを変更することを防ぎます。トランザクションが操作内の各データ行にロックを適用する場合、トランザクション ロックが解除されると、他のトランザクションはロックと競合する操作のみを実行できます。

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

悲観的ロックとは、外部(システム内の他の現在のトランザクションや外部システムからのトランザクション処理を含む)によって変更されるデータに対する保守的(悲観的)な態度を指します。したがって、データはサマー処理プロセス全体にわたってロックされます。悲観的ロックの実装は、一般的にデータベースが提供するロック機構に依存します(推奨チュートリアル:MySQLチュートリアル)

データベースでは、悲観的ロックのプロセスは次のようになります。

  • レコードを変更する前に、そのレコードの排他ロックを取得するようにしてください。
  • ロックに失敗した場合は、レコードが変更されていることを意味し、現在のクエリは待機するか、例外をスローする必要がある可能性があります。
  • ロックが正常に取得された場合、レコードを変更でき、トランザクションの完了後にロックが解除されます。
  • レコードを変更したり、排他ロックを追加したりする他の操作がある場合は、ロックを解除するまで待機するか、直接例外をスローします。

MySQL InnoDB での悲観的ロックの使用

悲観的ロックを使用するには、MySQL データベースの自動コミット プロパティをオフにする必要があります。これは、MySQL がデフォルトで自動コミット モードを使用するため、更新操作を実行すると、MySQL が結果をすぐにコミットすることを意味します。

//トランザクションの開始 begin;/begin work;/start transaction; (3つのうち1つを選択)

更新のために、id=1 の t_goods からステータスを選択します。

//商品情報に基づいて注文を生成します insert into t_orders (id,goods_id) values ​​(null,1);

//商品ステータスを2に変更

t_goods を更新し、status=2 を設定します。

//トランザクションをコミットする commit;/作業をコミットする;

上記のクエリ ステートメントでは、select...for update メソッドが使用され、排他ロックを開くことによって悲観的ロックが実装されています。対応するレコードはロックされ、他のトランザクションは、このトランザクションがコミットされるまで実行を待機する必要があります。

データをロックするために select ... for update を使用しますが、ロック レベルに注意する必要があります。MySQL InnoDB はデフォルトで行レベルのロックを使用します。行レベルのロックはすべてインデックスに基づいています。SQL ステートメントでインデックスが使用されない場合は、行レベルのロックは使用されず、テーブル全体のロックにはテーブルレベルのロックが使用されます。

特徴

データ処理のセキュリティを保証します

効率の面では、ロック メカニズムによってデータベースに追加のオーバーヘッドが発生し、デッドロックの可能性が高まります。

読み取り専用トランザクションでは競合がないため、ロックを使用する必要がなく、システム負荷が増加し、並列性が低下します。

楽観的ロック

楽観的同時実行制御も同時実行制御方式です。

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

楽観的ロックは悲観的ロックとは異なります。楽観的ロックでは、データが競合しないことを前提としています。したがって、データが送信および更新されるときに、データが競合しているかどうかを正式にチェックします。競合が見つかった場合は、ユーザーにエラー メッセージが返され、ユーザーが対処方法を決定できます。

楽観的ロックでは通常、レコード バージョン番号を使用してデータにバージョン識別子を追加し、データが更新されるとバージョン識別子を更新します。

成し遂げる

バージョン番号を使用する場合、データを初期化するときにバージョン番号を指定でき、データの更新操作ごとにバージョン番号に対して +1 操作が実行されます。現在のバージョン番号がデータの最新バージョン番号であるかどうかを判断します

1. 製品情報を照会する

t_goods から (ステータス、ステータス、バージョン) を選択します。ID は #{id} です。

2. 製品情報に基づいて注文を生成する

3. 商品のステータスを2に変更する

t_goods を更新

ステータス=2、バージョン=バージョン+1 を設定します

ここで、id=#{id}、version=#{version};

特徴

楽観的同時実行制御では、トランザクション間のデータ競合の可能性は小さいと判断され、可能な限り直接的に処理を進め、トランザクションがコミットされるまでロックしないため、ロックやデッドロックは発生しません。

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

<<:  iconfontアイコンライブラリをvueに導入するエレガントな実践記録

>>:  Linux ログ内のキーワードとその前後の情報を検索する方法の例

推薦する

CentOS7 での mysql 5.7.23 のバイナリ インストール

インターネット上のインストール情報は不均一で、落とし穴だらけです。インストールにはかなりの労力がかか...

mysql replace into の使用法の詳細な説明

replace ステートメントは、一般的に insert ステートメントに似ています。ただし、テーブ...

レスポンシブ Web デザイン手法を実装し、ウォーターフォール モデルに別れを告げる 5 つのステップ (グラフィック チュートリアル)

次の Web デザイン プロジェクトはレスポンシブにする必要があると上司をようやく納得させることがで...

ROS2のインストールとdocker環境の使い方について

目次Docker を使用する理由は何ですか? DockerのインストールROSイメージを取得するRO...

Jenkins は Docker イメージを構築し、Harbor ウェアハウスにプッシュします

目次DockerファイルドキュメントJenkins の設定Spring Boot プロジェクトでは、...

Vuexはセッションストレージデータを結合して、ページを更新するときにデータが失われる問題を解決します

目次序文1. 理由: 2. 解決策のアイデア: 1. ローカル保存方法: 2. 実装手順: 3. 最...

docker ポートを追加して dockerfile を取得する方法

DockerイメージからDockerfileを取得する docker 履歴 --format {{....

jQuery Ajax チャットボットの実装事例

チャットボットは多くの手作業を省くことができ、顧客サービス、天気予報対応など、さまざまな状況で使用で...

JS で async と await を使用する方法

目次1. 非同期2. 待つ: 3. 包括的なアプリケーション1. 非同期async 、非同期コードが...

Vue2.0/3.0 での provide と inject の使用例

目次1. provide/inject の用途は何ですか? 2. provide/injectの使い...

メモリ構成が過剰でMySQLが起動できない問題の解決方法

問題の説明MySQL の起動時にエラーが報告されます。エラー ログを確認してください。 [エラー] ...

追加、削除、変更、クエリを実行するための JS 操作オブジェクト配列のサンプルコード

1. はじめに最近、私は友人が JSON 配列を追加、削除、変更するための簡単なページを作成するのを...

インスピレーションを得るための7つのクールなダイナミックウェブサイトデザイン

デザインの分野では、毎年さまざまなデザインのトレンドや流行があります。たとえば、近年のレスポンシブデ...

MySQL開発標準と使用スキルの概要

1. 命名規則1. データベース名、テーブル名、フィールド名には小文字を使用し、アンダースコアで区切...

ccs3に基づくタイムライン実装方法

Web プロジェクトでは、タイムライン コントロールをよく使用します。この記事では、項目ごとに展開で...