ホームページ データベース mysql チュートリアル mysqlのオプティミスティックロックとは何ですか?

mysqlのオプティミスティックロックとは何ですか?

Jun 29, 2020 pm 03:56 PM
mysql 楽観的ロック

mysql の楽観的ロックは悲観的ロックに関連しています。楽観的ロックは、通常の状況ではデータが競合を引き起こさないことを前提としているため、データが更新のために送信されると、データの競合が正式に検出されます。競合が見つかると、エラー情報がユーザーに返され、ユーザーは何をすべきかを決定できます。

mysqlのオプティミスティックロックとは何ですか?

mysql の楽観的ロックは (楽観的ロック) 悲観的ロックと比較して、楽観的ロックはデータが一般に競合を引き起こさないことを前提としているため、データが更新のために送信されると、データの競合が正式に検出され、競合が見つかった場合はエラー メッセージがユーザーに返され、ユーザーが何をすべきかを決定できるようになります。

それでは、オプティミスティック ロックをどのように実装すればよいでしょうか? 一般的に、次の 2 つの方法があります:

1. データ バージョン (バージョン) 記録メカニズムを使用して、 を実現します。楽観的 ロックの最も一般的に使用される実装方法の 1 つ。データバージョンとは何ですか?つまり、通常は数値の「バージョン」フィールドをデータベース テーブルに追加することによって、データにバージョン識別子を追加します。データを読み込む際には、バージョンフィールドの値も合わせて読み出し、データが更新されるたびにバージョン値が1ずつインクリメントされます。

アップデートを送信すると、データベーステーブルの該当レコードの現在のバージョン情報を判断し、初めて取り出したバージョン値と比較します。初めて取り出したバージョン値と比較し、等しい場合は更新され、そうでない場合は期限切れデータとみなされます。次の図を使用して説明します。

mysqlのオプティミスティックロックとは何ですか?

上の図に示すように、更新操作が順番に実行されると、データのバージョン (バージョン) は競合することなく順番に増加します。ただし、異なる業務が同じバージョンのデータを変更した場合、最初に送信された操作 (図の B) はデータのバージョンを 2 に更新します。B の後に A が更新を送信すると、データのバージョンが変更されたことがわかります。 . の場合、A の更新操作は失敗します。

2. オプティミスティック ロックの 2 番目の実装方法は、最初の実装方法と似ています。また、オプティミスティック ロック制御を必要とするフィールドをテーブルに追加します。 . 、名前は重要ではありません。フィールド タイプは、上記のバージョンと同様のタイムスタンプを使用します。更新が送信されると、現在のデータベース内のデータのタイムスタンプがチェックされ、更新前に取得されたタイムスタンプと比較されます。一貫性がある場合は OK、そうでない場合はバージョンの競合です。

関連する学習の推奨事項: mysql ビデオ チュートリアル

##使用例:

MySQL を使用した場合InnoDB

例として 前の例を見てみましょう: 商品テーブルにフィールド ステータスがあります。ステータス 1 は製品が注文されていないことを意味し、ステータス 2 は製品が注文されていないことを意味します。次に、特定の商品を注文するときは、商品のステータスが 1 であることを確認する必要があります。プロダクト ID が 1 であるとします。

注文操作には 3 つのステップが含まれます:

1. 製品情報のクエリ

select (status,status,version) from t_goods where id=#{id}
ログイン後にコピー

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

3. 製品ステータスを 2

update t_goods 
set status=2,version=version+1
where id=#{id} and version=#{version};
ログイン後にコピー

に変更します

オプティミスティック ロックを使用するには、まず t_goods テーブルを変更し、バージョン フィールドを追加します。データは1です。

t_goods

テーブルの初期データは次のとおりです。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>mysql&gt; select * from t_goods; +----+--------+------+---------+ | id | status | name | version | +----+--------+------+---------+ | 1 | 1 | 道具 | 1 | | 2 | 2 | 装备 | 2 | +----+--------+------+---------+ 2 rows in set mysql&gt;</pre><div class="contentsignin">ログイン後にコピー</div></div>楽観的ロックの実装には、次のように練習用に MyBatis を使用します。

## 商品エンティティ クラス:

/** 
 * ClassName: Goods <br/> 
 * Function: 商品实体. <br/> 
 * date: 2013-5-8 上午09:16:19 <br/> 
 * @author chenzhou1025@126.com 
 */  
public class Goods implements Serializable {  
  
    /** 
     * serialVersionUID:序列化ID. 
     */  
    private static final long serialVersionUID = 6803791908148880587L;  
      
    /** 
     * id:主键id. 
     */  
    private int id;  
      
    /** 
     * status:商品状态:1未下单、2已下单. 
     */  
    private int status;  
      
    /** 
     * name:商品名称. 
     */  
    private String name;  
      
    /** 
     * version:商品数据版本号. 
     */  
    private int version;  
      
    @Override  
    public String toString(){  
        return "good id:"+id+",goods status:"+status+",goods name:"+name+",goods version:"+version;  
    }  
  
    //setter and getter  
  
}
ログイン後にコピー

GoodsDao

/** 
 * updateGoodsUseCAS:使用CAS(Compare and set)更新商品信息. <br/> 
 * 
 * @author chenzhou1025@126.com 
 * @param goods 商品对象 
 * @return 影响的行数 
 */  
int updateGoodsUseCAS(Goods goods);
ログイン後にコピー

mapper.xml

<update id="updateGoodsUseCAS" parameterType="Goods">  
    <![CDATA[ 
        update t_goods 
        set status=#{status},name=#{name},version=version+1 
        where id=#{id} and version=#{version} 
    ]]>  
</update>
ログイン後にコピー

GoodsDaoTest テスト クラス

@Test  
public void goodsDaoTest(){  
    int goodsId = 1;  
    //根据相同的id查询出商品信息,赋给2个对象  
    Goods goods1 = this.goodsDao.getGoodsById(goodsId);  
    Goods goods2 = this.goodsDao.getGoodsById(goodsId);  
      
    //打印当前商品信息  
    System.out.println(goods1);  
    System.out.println(goods2);  
      
    //更新商品信息1  
    goods1.setStatus(2);//修改status为2  
    int updateResult1 = this.goodsDao.updateGoodsUseCAS(goods1);  
    System.out.println("修改商品信息1"+(updateResult1==1?"成功":"失败"));  
      
    //更新商品信息2  
    goods1.setStatus(2);//修改status为2  
    int updateResult2 = this.goodsDao.updateGoodsUseCAS(goods1);  
    System.out.println("修改商品信息2"+(updateResult2==1?"成功":"失败"));  
}
ログイン後にコピー

出力結果:

good id:1,goods status:1,goods name:道具,goods version:1  
good id:1,goods status:1,goods name:道具,goods version:1  
修改商品信息1成功  
修改商品信息2失败
ログイン後にコピー

説明:

GoodsDaoTest テスト メソッド内また、同じバージョンのデータが異なる商品オブジェクトに割り当てられており、good1 オブジェクトが最初に変更されてから更新操作が実行され、実行が成功したこともわかりました。次に、goods2 を変更し、更新操作を実行すると、操作が失敗したことを示すメッセージが表示されます。この時点で、

t_goods

テーブルのデータは次のとおりです。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>mysql&gt; select * from t_goods; +----+--------+------+---------+ | id | status | name | version | +----+--------+------+---------+ | 1 | 2 | 道具 | 2 | | 2 | 2 | 装备 | 2 | +----+--------+------+---------+ 2 rows in set mysql&gt;</pre><div class="contentsignin">ログイン後にコピー</div></div> 最初の更新時に、ID 1 のデータ バージョンが 2 に変更されたことがわかります。したがって、good2 を更新すると、条件が一致しない更新が行われるため、更新は成功しません。具体的な SQL は次のとおりです:

update t_goods   
set status=2,version=version+1  
where id=#{id} and version=#{version};
ログイン後にコピー
このようにして、楽観的ロックを実現しました。

以上がmysqlのオプティミスティックロックとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MySQL:簡単な学習のためのシンプルな概念 MySQL:簡単な学習のためのシンプルな概念 Apr 10, 2025 am 09:29 AM

MySQLは、オープンソースのリレーショナルデータベース管理システムです。 1)データベースとテーブルの作成:createdatabaseおよびcreateTableコマンドを使用します。 2)基本操作:挿入、更新、削除、選択。 3)高度な操作:参加、サブクエリ、トランザクション処理。 4)デバッグスキル:構文、データ型、およびアクセス許可を確認します。 5)最適化の提案:インデックスを使用し、選択*を避け、トランザクションを使用します。

phpmyadminを開く方法 phpmyadminを開く方法 Apr 10, 2025 pm 10:51 PM

次の手順でphpmyadminを開くことができます。1。ウェブサイトコントロールパネルにログインします。 2。phpmyadminアイコンを見つけてクリックします。 3。MySQL資格情報を入力します。 4.「ログイン」をクリックします。

Navicatプレミアムの作成方法 Navicatプレミアムの作成方法 Apr 09, 2025 am 07:09 AM

NAVICATプレミアムを使用してデータベースを作成します。データベースサーバーに接続し、接続パラメーターを入力します。サーバーを右クリックして、[データベースの作成]を選択します。新しいデータベースの名前と指定された文字セットと照合を入力します。新しいデータベースに接続し、オブジェクトブラウザにテーブルを作成します。テーブルを右クリックして、データを挿入してデータを挿入します。

MySQLおよびSQL:開発者にとって不可欠なスキル MySQLおよびSQL:開発者にとって不可欠なスキル Apr 10, 2025 am 09:30 AM

MySQLとSQLは、開発者にとって不可欠なスキルです。 1.MYSQLはオープンソースのリレーショナルデータベース管理システムであり、SQLはデータベースの管理と操作に使用される標準言語です。 2.MYSQLは、効率的なデータストレージと検索機能を介して複数のストレージエンジンをサポートし、SQLは簡単なステートメントを通じて複雑なデータ操作を完了します。 3.使用の例には、条件によるフィルタリングやソートなどの基本的なクエリと高度なクエリが含まれます。 4.一般的なエラーには、SQLステートメントをチェックして説明コマンドを使用することで最適化できる構文エラーとパフォーマンスの問題が含まれます。 5.パフォーマンス最適化手法には、インデックスの使用、フルテーブルスキャンの回避、参加操作の最適化、コードの読み取り可能性の向上が含まれます。

NavicatでMySQLへの新しい接続を作成する方法 NavicatでMySQLへの新しい接続を作成する方法 Apr 09, 2025 am 07:21 AM

手順に従って、NAVICATで新しいMySQL接続を作成できます。アプリケーションを開き、新しい接続(CTRL N)を選択します。接続タイプとして「mysql」を選択します。ホスト名/IPアドレス、ポート、ユーザー名、およびパスワードを入力します。 (オプション)Advanced Optionsを構成します。接続を保存して、接続名を入力します。

SQLが行を削除した後にデータを回復する方法 SQLが行を削除した後にデータを回復する方法 Apr 09, 2025 pm 12:21 PM

データベースから直接削除された行を直接回復することは、バックアップまたはトランザクションロールバックメカニズムがない限り、通常不可能です。キーポイント:トランザクションロールバック:トランザクションがデータの回復にコミットする前にロールバックを実行します。バックアップ:データベースの定期的なバックアップを使用して、データをすばやく復元できます。データベーススナップショット:データベースの読み取り専用コピーを作成し、データが誤って削除された後にデータを復元できます。削除ステートメントを使用して注意してください:誤って削除されないように条件を慎重に確認してください。 WHERE句を使用します:削除するデータを明示的に指定します。テスト環境を使用:削除操作を実行する前にテストします。

単一のスレッドレディスの使用方法 単一のスレッドレディスの使用方法 Apr 10, 2025 pm 07:12 PM

Redisは、単一のスレッドアーキテクチャを使用して、高性能、シンプルさ、一貫性を提供します。 I/Oマルチプレックス、イベントループ、ノンブロッキングI/O、共有メモリを使用して同時性を向上させますが、並行性の制限、単一の障害、および書き込み集約型のワークロードには適していません。

MySQL:世界で最も人気のあるデータベースの紹介 MySQL:世界で最も人気のあるデータベースの紹介 Apr 12, 2025 am 12:18 AM

MySQLはオープンソースのリレーショナルデータベース管理システムであり、主にデータを迅速かつ確実に保存および取得するために使用されます。その実用的な原則には、クライアントリクエスト、クエリ解像度、クエリの実行、返品結果が含まれます。使用法の例には、テーブルの作成、データの挿入とクエリ、および参加操作などの高度な機能が含まれます。一般的なエラーには、SQL構文、データ型、およびアクセス許可、および最適化の提案には、インデックスの使用、最適化されたクエリ、およびテーブルの分割が含まれます。

See all articles