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

推薦する

MySQL5.7 マスタースレーブ構成例の分析

MySQL5.7マスタースレーブ構成の実装方法、具体的な内容は次のとおりですインストール環境:マスタ...

Ubuntu 16.04 で MySQL マスター スレーブ同期を設定する方法

準備1. マスターとスレーブのデータベースのバージョンは一致している必要があります2. マスターデー...

HTML コードを書くための 30 のヒント

1. HTMLタグは常に閉じる前のページのソース コードでは、次のような記述がよく見られます。 &l...

Dockerコンテナが起動直後に終了する問題を解決する

最近、Docker がコンテナの起動時に特定のプロセスを直接実行できるようにする方法を調べていたとこ...

優れたユーザー エクスペリエンス デザイナーが行うべき 5 つのこと (画像とテキスト)

この記事は、@C7210 によって翻訳されたブログ「Usability Counts」からの翻訳です...

jsはウォーターフォールフローのボトムアウトによるデータの動的ロードを実現します

この記事では、ウォーターフォールフローが底に達したときにデータを動的にロードするためのjsの具体的な...

ネイティブ CSS で無限テキストカルーセルを実装する一般的な方法

テキストカルーセルは私たちの日常生活で非常に一般的です。スーパーマーケットや実店舗の入り口には、テキ...

JavaScript でモバイル モーダル ボックスの効果を実現

この記事では、モバイルモーダルボックス効果を実現するためのJavaScriptの具体的なコードを参考...

MySQL InnoDB トランザクション ロック ソースコード分析

目次1. ロックとラッチ2. 繰り返し読み取り3. インサートロックプロセス3.1 ロックモード3....

MySQL は ACID トランザクションをどのように実装しますか?

序文最近、面接中に、MySQL の InnoDB エンジンがどのようにトランザクションを実装している...

MySQL のデータベース パフォーマンスに影響を与える要因の説明

データベースのパフォーマンスに関する話面接では、「データベースにどのくらい精通していますか?」など、...

HTML内のフレームセットタグが正常に表示されない原因の解析と解決方法

<frameset></frameset>は皆さんもよくご存知のものです。こ...

JavaScriptコールバック関数の詳細な理解

目次序文クイックレビュー: JavaScript 関数関数とは何ですか?関数を宣言する関数の呼び出し...

CocosCreator Huarongdaoデジタルパズルの詳しい説明

目次序文文章1. パネル2. 華容島ソリューション3. コード4. 注記序文華容路とは何ですか? 誰...