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