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

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

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

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

Q&A

1回答

2857閲覧

同じテーブルのサブクエリで値をUPDATEした際に行ロックとなるか知りたいです

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

0グッド

0クリップ

投稿2017/02/21 09:12

編集2017/02/21 17:47

CREATE TABLE test_table (
id bigint(20) NOT NULL AUTO_INCREMENT,
test_date datetime NOT NULL COMMENT '追加日時',
insert_date datetime NOT NULL COMMENT '登録日時',
update_date timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日時',
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=85 DEFAULT CHARSET=utf8 COMMENT='テスト';

上記テーブルに下記アップデートを実行した場合、UPDATE文は行ロックになりますか?

UPDATE test_table SET test_date = NOW() WHERE id IN ( SELECT id FROM (SELECT id FROM test_table WHERE test_date > NOW() ) as temp )

Update文をSelectに変えたQueryのexplainを追記

mysql> explain select id from test_table WHERE id IN ( SELECT id FROM (SELECT id FROM test_table WHERE test_date > NOW() ) as temp );
+----+-------------+------------+-------+---------------+-------------+---------+---------------------------------+------+-------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+-------+---------------+-------------+---------+---------------------------------+------+-------------------------------------+
| 1 | PRIMARY | test_table | index | PRIMARY | PRIMARY | 8 | NULL | 1 | Using index |
| 1 | PRIMARY | <derived3> | ref | <auto_key0> | <auto_key0> | 8 | development_web01.test_table.id | 2 | Using index; FirstMatch(test_table) |
| 3 | DERIVED | test_table | ALL | NULL | NULL | NULL | NULL | 1 | Using where |
+----+-------------+------------+-------+---------------+-------------+---------+---------------------------------+------+-------------------------------------+

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

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

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

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

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

guest

回答1

0

検証したわけではないのですが。

InnoDBはアクセスした行をロックするので、行ロックが発生します。
そしてサブクエリで、test_date > NOW() から、IDを探しているので、
結果、全行に対してアクセスが発生します。

であれば、結果的には全行に行ロックが発生する、と考えられます。

実際にテーブルを作成しているのであれば、検証してみればいかがでしょうか。
以下のサイトが参考になるかと。

InnoDBで行ロック/テーブルロックになる条件を調べた #mysqlcasual Advent Calendar 2013

投稿2017/02/22 01:28

akio221

総合スコア716

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問