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是讀取提交的。