2014-02-25 93 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是读取提交的。

回答