我有一個關於MySQL InnoDB的問題。例如:我創建了下面的表有: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'鎖,以便在線程A釋放鎖之前,線程B不能獲得'X'鎖。我的問題是:從線程B的角度來看,當MySQL向我返回錯誤1205時,我怎麼能知道哪個線程/連接阻塞了我的請求(獲取表'SeqNum的'UPDATE'特權) ? 如果threadA在獲得X鎖之後什麼都不做,並且我在線程B中運行'show processlist',我所擁有的是:具有'Sleep'狀態的多個線程(我假設有超過兩個線程連接到數據庫) ,我無法確定哪個線程阻止了我的請求?
希望我明確地解釋了這個問題。謝謝!
是的,兩個會話都在交易中。我只是在我的問題中添加了交易聲明。我的問題不是爲什麼第一屆會議阻止了第二屆會議。但是,從第二屆會議來看,如何知道哪個會話阻止了它的請求?當然,我認爲有兩場以上的會議。 – WilliamLou 2010-10-21 20:11:08
我誤解了你的問題,我以爲你馬上就要超時了,對不起! – 2010-10-21 20:21:00