【发布时间】:2014-02-25 03:11:19
【问题描述】:
我有一个关于 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是读提交的。
【问题讨论】:
标签: mysql transactions isolation-level