У меня вопрос по 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)
Теперь у меня есть два подключения 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 по истечении тайм-аута ожидания блокировки: Превышен тайм-аут ожидания блокировки; попробуйте перезапустить транзакцию.
Это имеет смысл, потому что threadA установил блокировку «X» на эту строку, так что поток B НЕ сможет получить блокировку «X», пока поток A не снимет блокировку.
Теперь мой вопрос: с точки зрения потока B, как я могу узнать, какой поток / соединение блокирует мой запрос (для получения привилегии «UPDATE» для таблицы «SeqNum»), когда MySQL возвращает мне ошибку 1205? Если threadA ничего не делает после того, как получил блокировку X, и я запускаю 'show processlist' в потоке B, все, что у меня есть: несколько потоков со статусом 'Sleep' (я предполагаю, что к базе данных подключено более двух потоков), Я НЕ могу определить, какой поток заблокировал мой запрос?
Надеюсь, я ясно объяснил вопрос. Спасибо!