面接では、select...for update がテーブルをロックするのか、それとも行をロックするのか尋ねられました。

面接では、select...for update がテーブルをロックするのか、それとも行をロックするのか尋ねられました。

select クエリ ステートメントはロックされませんが、select .......for update はクエリ機能に加えてロックされ、悲観的ロックになります。

したがって、行ロックを追加するかテーブル ロックを追加するかは、インデックス/主キーが使用されているかどうかによって決まります。

インデックス/主キーがない場合、それはテーブル ロックであり、そうでない場合は行ロックです。

確認する:

テーブルSQLの作成

//idは主キーです //nameは一意のインデックスです CREATE TABLE `user` (
	`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(255) デフォルト NULL,
	`age` INT ( 11 ) デフォルト NULL,
    `code` VARCHAR(255) デフォルト NULL,
	主キー ( `id` )、
    キー `idx_age` ( `age` ) BTREE の使用 
) エンジン = INNODB AUTO_INCREMENT = 1570068 デフォルト文字セット = utf8

自動送信をオフにして、@@autocommit=0; を設定して手動送信に設定する必要があります。 0 は手動送信を表し、1 は自動送信を表します。

例の検証と組み合わせる

例1:

主キー ID をクエリの条件として使用し、別のトランザクションを開始してデータを更新します。更新はブロックされ、ロックされ、クエリ対象の ID 1 の行データがロックされます。

図1は最初のトランザクションを示しており、トランザクションはコミットされていない。

図 2 は、データの更新時にブロックされる 2 番目のトランザクションを示しています。

図 3 は、ロックを長時間取得できないためにエラーが発生する 2 番目のトランザクションを示しています。

例2:

ID 2 の別のデータを更新するためのトランザクションを開きます。

例3(インデックス):

テーブルが最初に作成されたときに、年齢に対して一意のインデックスが作成されました。

例4:

共通のフィールドコードを使用して操作する

別のトランザクションで、別のデータを更新します。更新が成功すると行がロックされ、失敗するとテーブルがロックされます。

結果:

クエリ条件でインデックスまたは主キーが使用されている場合、更新時に ..... を選択すると行ロックが実行されます。

通常のフィールド (インデックス/主キーなし) の場合は、更新に ..... を選択するとテーブルがロックされます。

これで、「select for update はテーブルまたは行をロックするかどうか」というインタビューの質問に関するこの記事は終了です。関連する select for update コンテンツの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • 更新とデータ整合性処理のためのMySQLトランザクション選択の説明
  • MySQL データベースのデッドロック プロセス分析 (更新を選択)
  • mysql SELECT FOR UPDATE 文の使用例

<<:  CSS で TikTok テキスト揺れエフェクトを実装する例

>>:  【HTML要素】タグテキストの詳細説明

推薦する

フレックスレイアウトにおけるflex-growとflex-shrinkの計算方法の詳しい説明

CSS のFlex(彈性布局)すると、Web ページのレイアウトを柔軟に制御できます。Flex Fl...

TSオブジェクトのスプレッド演算子とレスト演算子の詳細な説明

目次概要オブジェクトの残り属性オブジェクトの拡張プロパティオブジェクトの浅いコピーを作成するkeyo...

JavaScript ではおそらく switch 文を使う必要はない

目次スイッチも複雑なコードブロックもありませんPythonからのインスピレーション辞書を使用してスイ...

モバイルウェブサイトの開発に関するいくつかの結論

ウェブサイトのモバイル版には、少なくともいくつかの基本機能が必要です。 1. ページの適用性の問題:...

HTML で複数のクラス属性を定義する場合の無効な解決策

HTML を記述する過程で、クラス属性に複数の値を定義することがよくありますが、定義した値が無効であ...

Vueエンジニアがカプセル化しなければならない埋め込み命令の知識のまとめ

目次序文指導の基本フック機能フック関数のパラメータ文章使い方とアイデア成し遂げる汎用性を高める要約す...

RabbitMQ の Docker インストールと設定手順

目次単一マシンの展開オンラインプルミラーを見るRabbitMQを作成して実行するMQコンテナを正常に...

IIS サーバーから apk ファイルをダウンロードする際の 404 エラーの解決策

最近、IIS をサーバーとして使用すると、apk ファイルがサーバーにアップロードされましたが、ダウ...

Nginx+Apache の動的および静的分離の導入の詳細な例

Nginx の動的および静的分離の概要Nginx は静的処理能力が強力ですが、動的処理能力が不十分で...

ネイティブ JS で音楽プレーヤーを実装するためのサンプル コード

この記事では主に、次のように共有されるネイティブ JS 音楽プレーヤーのサンプル コードを紹介します...

よく使われるnginxの書き換えルールの詳細な説明

この記事では、Web ページのリンクを美しくするためによく使用される書き換えルールをいくつか紹介しま...

MySQL 5.7を完全にアンインストールするための詳細な手順

この記事は主に、MySQLを再インストールする際のクリーンでないアンインストールのさまざまな問題をま...

Webリクエストと処理のTomcatソースコード分析

目次序文1. エンドポイント2. 接続ハンドラ3. コヨーテ4. コンテナ責任チェーンパターン序文T...

Prometheus+Grafanaによるnginxの監視方法を分析する

目次1. ダウンロード2. nginxとnginx-vts-exporterをインストールする3. ...