面接では、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要素】タグテキストの詳細説明

推薦する

Docker /var/lib/docker/aufs/mnt ディレクトリのクリーニング方法

会社のサービスはdockerを使用しており、ディスクマンが見つかりました。その後、次のコマンドを実行...

30分でReact Hooksを包括的に理解できます

目次概要1. 使用状態1.1 3つの概念に関する質問1.2 例1.3 注記2. リデューサーを使用す...

ESXI の仮想マシンにワークステーションをインストールするときに発生するネットワーク障害の解決策

問題の説明ESXI で Windows にワークステーションをインストールした後、内部の仮想マシンは...

Dockerでリモートアクセスを有効にする方法

DockerデーモンソケットDocker デーモンは、 unix 、 tcp 、 fdの 3 種類の...

VMware仮想マシンの起動時に黒い画面が表示される問題を解決する

# VMware ハードディスクの起動優先順位を調整するステップ 1: 電源をオンにすると、BIOS...

MySQL における一般的なランキングの問題をいくつかまとめます

序文:一部のアプリケーション シナリオでは、成績や年齢によるランキングなど、ランキングの問題が発生す...

テキストエリアをレイアウトしたときにテキストが左下にあり、サイズを変更できない問題の解決策

2つの小さな問題ですが、長い間私を悩ませていました。最初の質問テキストエリアの左側のテキストは常にテ...

Linux での GDB 入門チュートリアル

序文gdb は Linux で非常に便利なデバッグ ツールです。コマンドライン モードのデバッグ ツ...

Reactにおける制御されたコンポーネントと制御されていないコンポーネントの簡単な分析

目次制御されていないコンポーネント制御コンポーネント知らせ結論は制御されていないコンポーネントフォー...

js オプション連鎖演算子の使用

序文オプションの連鎖演算子 (?.) を使用すると、チェーン内の各参照が有効であることを明示的に検証...

Docker Machineの詳細な説明

Docker と Docker Machine の違いDocker はクライアント サーバー アーキ...

Reactは二次的連鎖効果(階段効果)を実現する

この記事では、二次リンク効果を実現するためのReactの具体的なコードを参考までに共有します。具体的...

MySQLクエリの冗長インデックスと未使用のインデックス操作

MySQL 5.7 以降のバージョンでは、冗長インデックス、重複インデックス、およびインデックスを使...

Vue.js フロントエンドフレームワークにおけるイベント処理の概要

1. v-onイベント監視DOM イベントをリッスンするには、v-on ディレクティブを使用します。...

MySQL LOAD_FILE() 関数メソッドの概要

MySQL では、LOAD_FILE() 関数はファイルを読み取り、その内容を文字列として返します。...