我有一个关于 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 Error: Lock wait timeout exceeded; 尝试重新启动事务。
这是有道理的,因为线程 A 在该行上放置了“X”锁,因此线程 B 在线程 A 释放锁之前无法获得“X”锁。
现在,我的问题是:从线程 B 的角度来看,当 MySQL 向我返回错误 1205 时,我怎么知道哪个线程/连接阻塞了我的请求(以获得表 'SeqNum' 的 'UPDATE' 权限)?如果 threadA 在获得 X 锁后什么都不做,而我在线程 B 中运行“show processlist”,我所拥有的只是:几个具有“Sleep”状态的线程(我假设有两个以上的线程连接到数据库),我无法确定哪个线程阻止了我的请求?
希望我清楚地解释了这个问题。谢谢!