我有一个关于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是提交的。
发布于 2014-02-25 05:38:06
wlq3是数据库中提交的值,所以事务B读取这个值。Jim的更新还没有提交,锁不会阻止读取,只会阻止更新,这是由于在InnoDB中实现的MVCC锁定模型。
有关更多信息,请参见此链接:InnoDB's row locking the same as MVCC Non-Blocking Reads?
https://stackoverflow.com/questions/22003822
复制相似问题