У меня есть вопрос о 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» (я предполагаю, что к базе данных подключено более двух потоков),Я не могу определить, какая нить заблокировала мой запрос?
Надеюсь, я четко объяснил вопрос.Спасибо!