質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

Q&A

解決済

1回答

2108閲覧

mysql 5.7 SELECT FOR UPDATEでテーブルロックになってしまう理由

t.oguro

総合スコア7

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

0グッド

1クリップ

投稿2021/11/12 02:45

編集2021/11/12 03:56

発生している問題・エラーメッセージ

以下のようなテーブルとレコードがあリ、iD1と2のレコードにのみ行ロックをかけたいのですが、
SELECT FOR UPDATEのカラム指定によってはテーブルロックとなる場合があります。

Userテーブル

カラムindexその他
idint(11)primary keyauto_increment
namevarchar(255)
emailvarchar(255)index

レコード

idnameemail
1太郎test1@example.com
2二郎test2@example.com
3花子test3@example.com
4洋子test4@example.com

試したこと

抽出カラムをアスタリスクにすると、想定通りID=1,2のみ行ロックをとることができます。

sql

1SELECT * FROM user WHERE id IN (1, 2) FOR UPDATE; => 行ロック

しかし、抽出カラムをIDのみにすると、テーブルロックとなってしまい、ID3,4の更新も出来なくなってしまいます。

sql

1SELECT id FROM user WHERE id IN (1, 2) FOR UPDATE; => テーブルロック

なぜID指定のみだとテーブルロックになってしまうのかが疑問なのですが、どなたかご教示いただけますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/11/12 02:48

> iD1と2のレコードにのみ行ロックをかけたいのですが どういった目的でロックが必要なのでしょうか?
guest

回答1

0

自己解決

自分のローカルDBのレコード数が少なかったため、オプティマイザがより低コストな全行ロックで取得したことが原因でした。
レコードを増やして試したところ、想定通りのロックが取れましたので解決といたします。

投稿2021/11/12 06:39

t.oguro

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問