2014-02-25 140 views
0

我對MySQL InnoDB有個疑問。例如:我有線程A開始交易:困惑於Mysql鎖定

mysql> start transaction; 
Query OK, 0 rows affected (0.00 sec) 

mysql> update user set name = "Jim" where id = 1; 
Query OK, 1 row affected (0.00 sec) 
Rows matched: 1 Changed: 1 Warnings: 0 

然後,我只是離開線程A,因爲它是。我開始另一個線程B要做到這一點:

mysql> start transaction; 
Query OK, 0 rows affected (0.00 sec) 

mysql> update user set name = "Tom" where id = 1; 

而且我得到了錯誤:

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 

這是有道理的,因爲線程A放一個「X」鎖定該行。

然後我用線程B要做到這一點:

mysql> start transaction; 
Query OK, 0 rows affected (0.01 sec) 

mysql> select * from user where id = 1; 
+----+------+ 
| id | name | 
+----+------+ 
| 1 | wlq3 | 
+----+------+ 
1 row in set (0.00 sec) 

在這裏,我很困惑。就像我剛纔所說的,線程A在該行上放置了一個'X'鎖。爲什麼線程B可以讀取這一行。在我看來,閱讀數據需要一個共享鎖,但獨佔鎖已經在這些數據上。有沒有人可以幫助我,謝謝!

順便說一下,線程A的隔離級別是可重複讀取的,而線程B是讀取提交的。

回答