MySQL InnoDB について質問があります。例: 次のテーブルを作成しました。
mysql>CREATE TABLE IF NOT EXISTS `SeqNum`
(
`id` varchar(10) NOT NULL,
`seq_num` BIGINT(30) default 0,
PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql>INSERT IGNORE INTO `SeqNum` VALUES('current',0);
Query OK, 1 rows affected (0.00 sec)
現在、同じデータベースへの 2 つの mysql 接続があり、それらをスレッド A および B と名付けています。スレッド A には、次の SQL ステートメントがあります。
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select `seq_num` from SeqNum where `id`='current' FOR UPDATE;
+---------+
| seq_num |
+---------+
| 0 |
+---------+
1 row in set (0.01 sec)
そして、スレッドAをそのままにしておきます。
スレッド B で、同じクエリを実行したいと思います。
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql>SELECT `current_seq_num` FROM SeqNum WHERE `id` = 'current' FOR UPDATE;
スレッド B は、ロック待機タイムアウト後に MySQL 1205 エラーをスローします。ロック待機タイムアウトが超過しました。トランザクションを再開してみてください。
スレッドAがその行に「X」ロックを設定したため、スレッドAがロックを解放するまでスレッドBは「X」ロックを取得できないため、これは理にかなっています。
さて、私の質問は次のとおりです。スレッド B の観点から、MySQL がエラー 1205 を返したときに、どのスレッド/接続が私の要求をブロックするか (テーブル 'SeqNum' の 'UPDATE' 権限を取得するため) をどのように知ることができますか? X ロックを取得した後、threadA が何もしていない場合、スレッド B で「show processlist」を実行すると、「Sleep」ステータスの複数のスレッド (データベースに 2 つ以上のスレッドが接続されていると仮定します) しかありません。リクエストをブロックしたスレッドを特定できませんか?
うまくいけば、私は質問を明確に説明しました。ありがとう!