我对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是读取提交的。
答案 0 :(得分:1)
好wlq3
是数据库中的已提交值,因此事务B读取此值。 Jim
的更新尚未提交。锁定不会阻止读取,它只会阻止更新,这是由于在InnoDB中实现的MVCC锁定模型。
有关详细信息,请参阅此链接:InnoDB's row locking the same as MVCC Non-Blocking Reads?