いくつかのMySQL更新操作のケース分析

いくつかのMySQL更新操作のケース分析

この記事では、ユーザー アカウント残高の更新のケース スタディを通じて、いくつかのデータ更新操作の長所と短所を分析します。これが皆さんのお役に立てれば幸いです🐶。

データベースバージョン: mysql 5.7.23

ケーススタディ

データベースを作成するための DDL:

テーブル `hw_account` を作成します (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) デフォルト NULL,
  `balance` int(11) デフォルト NULL,
  `status` varchar(20) デフォルト NULL,
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP、
  `update_time` タイムスタンプ NULL デフォルト CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP、
  主キー (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 デフォルト CHARSET=utf8mb4;

アカウント残高を更新する

直接更新

解決策1: クエリ後に更新する

# データクエリ select * from hw_account where id = 1;

# データを更新します update hw_account set balance = 5 where id = 1;

問題は、操作を 2 つの部分に分割して同時に実行すると、更新が失われる可能性があることです。

楽観的ロック方式

バージョン番号操作を使用します。つまり、データベースに楽観的ロックを追加します。

# データクエリ select * from hw_account where id = 1;

# データを更新 update hw_account set balance = 5 、version = version + 1 
  ここで、id = 1、version = n;
  
# 行 < 1 の場合に成功かどうかを判断します {
   ロールバック}

既存の問題は、このデータが同時に操作されると、他のリクエストが失敗することです。このリクエストのフロントエンド リンクが比較的長い場合、ロールバック コストは比較的高くなります。

ロックフリーソリューション

クエリは必要なく、データベース計算が使用され、バージョン番号操作は必要ありません。有効性はドメイン値を通じて直接判断されます。具体的なSQLは次のとおりです。

# データを更新 update hw_account set balance = balance + @change_num 、version = version + 1 
  ここで、id = 1、version = n;
  
# 行 < 1 の場合に成功かどうかを判断します {
   ロールバック}

このソリューションは変更が比較的簡単ですが、データ計算に依存しており、特にユーザーフレンドリーとは言えません。

キューイング操作

データ要求は、Redis または ZK の分散ロックを通じてキューに入れられます。次にデータを更新します。

# 疑似コード if (分散ロックを取得) {
  hw_account を更新し、balance を @balance に設定し、id を 1 に設定します。
} それ以外 {
  # 待機状態に入るか、スピンしてロックを取得します}

よくある質問

データに update_time フィールドが存在する場合、影響を受ける行数はいくつですか?

update_timeフィールドは次のように定義されます。データがid = 1、status = 1で、データを更新するためのSQL文が

hw_account を更新し、`status` = 1 を設定します (id = 1)。

返される影響を受ける行の数は 0 です。

更新が実行されたが、影響を受ける行数が 0 の場合、行ロックが追加されますか?

はい、すべての更新ステートメントは行ロックを追加します (前提条件、トランザクション内)

参考文献

ウェブ

これで、いくつかの MySQL 更新操作のケース分析に関するこの記事は終了です。より関連性の高い MySQL 更新操作コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL データベース ターミナル - 一般的な操作コマンド コード
  • MySQL データベースの集計クエリと結合クエリ操作
  • MySQLデータベースのデータテーブルに関する詳細な基本操作
  • MySQL データベースの操作とデータ型
  • MySQL 演算子の具体的な使用法 (and、or、in、not)
  • MySQL 8.0はJSONを扱えるようになりました
  • MySQLの高度な操作手順の概要

<<:  Linux環境でよく使われるMySQLコマンドの紹介

>>:  Vue の 4 つのカスタム命令の説明と使用例

推薦する

MySQL 結合クエリの原則の知識ポイント

MySQL 結合クエリ1. 基本概念2 つのテーブルの各行をペアで水平に接続して、すべての行の結果を...

Mysql 自己結合クエリ例の詳細な説明

この記事では、Mysql の自己結合クエリについて説明します。ご参考までに、詳細は以下の通りです。自...

JavaScript 型検出方法の例のチュートリアル

序文JavaScriptはWebフロントエンドで広く使われている言語の一つであり、Webアプリケーシ...

Node.js でのクラスター作成に関する簡単な説明

目次クラスタクラスターの詳細クラスター内のイベントクラスター内のメソッドクラスター内の属性クラスター...

MySQL での select、distinct、limit の使用

目次1. はじめに2. 選択2.1 単一列のクエリ2.2 複数の列のクエリ2.3 すべての列をクエリ...

さまざまな MySQL テーブルソートルールのエラーの分析

MySQL が複数のテーブルを結合するときに、次のエラーが報告されます: [Err]1267 – 操...

CSSオーバーフローメカニズムについての簡単な説明

CSS オーバーフローのメカニズムを詳細に学ぶ必要があるのはなぜですか?実際の開発プロセスでは、コン...

ウェブデザインの詳細分析に関する詳細な議論

設計業務では、設計者がレビューに参加したり、リーダーの一部が設計案の詳細が足りないと言っているのをよ...

Docker イメージのエクスポート、インポート、コピーの例の分析

最初の解決策は、イメージを公開イメージリポジトリにプッシュし、それをプルダウンすることです。 2 番...

MySQL テーブルを返すとインデックスが無効になるケースの説明

導入MySQL InnoDB エンジンがレコードをクエリし、インデックス カバレッジを使用できない場...

Docker 大規模プロジェクトのコンテナ化変革

仮想化とコンテナ化は、クラウドベースのプロジェクトでは避けられない 2 つの問題です。仮想化は純粋な...

Mac で MySQL 8.0.22 のパスワードを取得する方法

Mac 最新バージョンの MySQL 8.0.22 パスワード回復問題の説明:昨日、突然、Macで最...

Swiper+echartsは複数のダッシュボードの左右スクロール効果を実現します

この記事では、ダッシュボードの左右スクロール効果を実現するためのスワイパー+echartsの具体的な...

Reactでのこのリファレンスの詳細な説明

目次原因:以下を実行します: 1. コンストラクター2.レンダリング機能3.bind関数とarrow...

Linux に JDK1.8 をインストールするための詳細なチュートリアル

1. 設置前の清掃 rpm -qa | grep jdk rpm -qa | grep gcj yu...