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