关于Mysql锁的困惑

时间:2014-02-25 03:11:19

标签: mysql transactions isolation-level

我对MySQL InnoDB有疑问。例如:我有线程A来开始交易:

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

1 个答案:

答案 0 :(得分:1)

wlq3是数据库中的已提交值,因此事务B读取此值。 Jim的更新尚未提交。锁定不会阻止读取,它只会阻止更新,这是由于在InnoDB中实现的MVCC锁定模型。

有关详细信息,请参阅此链接:InnoDB's row locking the same as MVCC Non-Blocking Reads?